qt对sqlite数据库多线程的操作

简介: 本文总结了在Qt中进行SQLite数据库多线程操作时应注意的四个关键问题,包括数据库驱动加载、加锁、数据库的打开与关闭,以及QsqlQuery变量的使用。

QT中sqlite多线程操作4个注意问题

对数据库多线程的操作:

一开始写的程序由于没有注意到多线程对数据库和对整个程序的影响,虽然程序没有报错,但是在后期的长时间调试的时候暴露出了很多问题。

首先是程序运行两个小时后会出现数据库死锁无法操作的问题,前期通过给数据库操作进行加锁仍无法解决该问题。后经过查找资料,经过解决了该问题。所以在此总结一下多线程数据操作时应该进行的处理:

这是一段标准的多线程前提下对数据库进行的操作(我自认为的哈),将会按照这段代码进行说明。

1多线程下的各个线程或是定时器数据库驱动加载需要独立进行

之前写程序,当一个程序多个类需要操作同一个数据库时,处理结果是将数据库的QsqlDatabase作为参数传给需要的子类。这样做在单进程的程序里没有太大的问题。但是在多线程里,由于线程的特殊性,这样做就会出现问题。所以最好的办法就是,在每个线程或是定时器里,单独的进行数据库驱动的加载,定义一个不同的名字。并且在使用中,QsqlQuery变量一定要设置当前所在现成的QsqlDatabase作为参数:

2 多线程操作数据库一定要加锁

这点一般都会做,需要注意一点的就是如果程序里如果有加数据库打开判断的话,一定要记得打开失败return的时候给解锁,不然也会非常容易的造成死锁。

3 数据库最好是每次操作的时候再打开,用完就关闭,不要一直打开不关

数据库打开的时候会有一个临时文件,将数据都转移到临时文件进行操作,如果不关闭的话,这个临时文件是不会清除的,也就是说你的另一个线程正好要操作数据库,那么数据库里面是没有数据的,所以,一定要每次操作的时候打开关闭。

4 重点说一下QsqlQuery 这个变量的问题

前期写代码测试的时候发现,在通过如上办法后,多线程下数据库仍然是经过俩小时必然思索,纠结了很久后开始换个思路打印一下调试信息,找了个数据库操作最频繁的代码段进行调试,估摸着打印了一下关闭数据库的时候的调试信息,发现虽然参数结果是-1,也就是正常关闭的参数,但是真正正常关闭数据库的错误信息后两个参数是空的,而我的打印出来后两个参数是数据库错误关闭的说明。这就很让人费解,能出错的也就只有QsqlQuery了,可是我再加上clear()和设置不同的变量名来测试发现,打印信息还是不正常,终于在咨询高人后得到的办法就是在每次声明QsqlQuery变量的时候,都加上一对{}花括号来设定这个变量的作用域生命周期,执行完这段代码就让它自己结束生命,果然,这次打印信息正常了。但是这个变量对内存的影响至今也不了解,为什么会产生这样的问题。以后水平提高可能会有所顿悟,但是现在只要能解决问题就好。

其他的数据库操作什么的不多说了。这次解决问题,学到的东西不少,要更加理解了一个道理,没有错误的代码不一定是优秀的代码。另外这次能比较快的定位出问题所在是关键,调试的过程就是不断的写打印信息,光靠猜是不行的。

这就是我对多线程下数据库遇到的一些问题进行总结,不足之处以后会补充

本人水平也有限,刚毕业的菜鸟,只是希望能对同样遇到问题的朋友有所帮助。哈哈

目录
打赏
0
1
1
1
48
分享
相关文章
在C++的QT框架中实现SQLite数据库的连接与操作
以上就是在C++的QT框架中实现SQLite数据库的连接与操作的基本步骤。这些步骤包括创建数据库连接、执行SQL命令、处理查询结果和关闭数据库连接。在实际使用中,你可能需要根据具体的需求来修改这些代码。
107 13
【赵渝强老师】达梦数据库的线程结构
达梦数据库采用单进程、多线程结构,利用对称服务器架构实现高效资源利用与可扩展性。其核心线程类型包括监听线程(管理客户端连接)、I/O线程(处理数据页读写)、工作线程(执行数据操作)、调度线程(定时任务管理)和日志刷新线程(确保REDO日志刷盘)。通过合理分工与同步机制,达梦数据库实现了高性能与稳定性。视频讲解进一步详细介绍了各线程的功能与协作方式。
【赵渝强老师】达梦数据库的线程结构
【YashanDB知识库】如何利用数据库线程池稳定TP吞吐
【YashanDB知识库】如何利用数据库线程池稳定TP吞吐
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
567 15
数据库知识:了解SQLite或其他移动端数据库的使用
【10月更文挑战第22天】本文介绍了SQLite在移动应用开发中的应用,包括其优势、如何在Android中集成SQLite、基本的数据库操作(增删改查)、并发访问和事务处理等。通过示例代码,帮助开发者更好地理解和使用SQLite。此外,还提到了其他移动端数据库的选择。
111 8
使用 Python 解析火狐浏览器的 SQLite3 数据库
本文介绍如何使用 Python 解析火狐浏览器的 SQLite3 数据库,包括书签、历史记录和下载记录等。通过安装 Python 和 SQLite3,定位火狐数据库文件路径,编写 Python 脚本连接数据库并执行 SQL 查询,最终输出最近访问的网站历史记录。
107 4
轻量级数据库的利器:Python 及其内置 SQLite 简介
轻量级数据库的利器:Python 及其内置 SQLite 简介
132 3
PbootCMS提示错误信息“未检测到您服务器环境的sqlite3数据库扩展...”
PbootCMS提示错误信息“未检测到您服务器环境的sqlite3数据库扩展...”
sqlite 数据库 介绍
sqlite 数据库 介绍
132 0
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
274 1