当前位置:网站首页>qt对sqlite数据库多线程的操作
qt对sqlite数据库多线程的操作
2022-06-21 10:57:00 【yantuguiguziPGJ】
对数据库多线程的操作:
一开始写的程序由于没有注意到多线程对数据库和对整个程序的影响,虽然程序没有报错,但是在后期的长时间调试的时候暴露出了很多问题。
首先是程序运行两个小时后会出现数据库死锁无法操作的问题,前期通过给数据库操作进行加锁仍无法解决该问题。后经过查找资料,经过解决了该问题。所以在此总结一下多线程数据操作时应该进行的处理:
这是一段标准的多线程前提下对数据库进行的操作(我自认为的哈),将会按照这段代码进行说明。
1多线程下的各个线程或是定时器数据库驱动加载需要独立进行
之前写程序,当一个程序多个类需要操作同一个数据库时,处理结果是将数据库的QsqlDatabase作为参数传给需要的子类。这样做在单进程的程序里没有太大的问题。但是在多线程里,由于线程的特殊性,这样做就会出现问题。所以最好的办法就是,在每个线程或是定时器里,单独的进行数据库驱动的加载,定义一个不同的名字。并且在使用中,QsqlQuery变量一定要设置当前所在现成的QsqlDatabase作为参数:
2 多线程操作数据库一定要加锁
这点一般都会做,需要注意一点的就是如果程序里如果有加数据库打开判断的话,一定要记得打开失败return的时候给解锁,不然也会非常容易的造成死锁。
3 数据库最好是每次操作的时候再打开,用完就关闭,不要一直打开不关
数据库打开的时候会有一个临时文件,将数据都转移到临时文件进行操作,如果不关闭的话,这个临时文件是不会清除的,也就是说你的另一个线程正好要操作数据库,那么数据库里面是没有数据的,所以,一定要每次操作的时候打开关闭。
4 重点说一下QsqlQuery 这个变量的问题
前期写代码测试的时候发现,在通过如上办法后,多线程下数据库仍然是经过俩小时必然思索,纠结了很久后开始换个思路打印一下调试信息,找了个数据库操作最频繁的代码段进行调试,估摸着打印了一下关闭数据库的时候的调试信息,发现虽然参数结果是-1,也就是正常关闭的参数,但是真正正常关闭数据库的错误信息后两个参数是空的,而我的打印出来后两个参数是数据库错误关闭的说明。这就很让人费解,能出错的也就只有QsqlQuery了,可是我再加上clear()和设置不同的变量名来测试发现,打印信息还是不正常,终于在咨询高人后得到的办法就是在每次声明QsqlQuery变量的时候,都加上一对{}花括号来设定这个变量的作用域生命周期,执行完这段代码就让它自己结束生命,果然,这次打印信息正常了。但是这个变量对内存的影响至今也不了解,为什么会产生这样的问题。以后水平提高可能会有所顿悟,但是现在只要能解决问题就好。
其他的数据库操作什么的不多说了。这次解决问题,学到的东西不少,要更加理解了一个道理,没有错误的代码不一定是优秀的代码。另外这次能比较快的定位出问题所在是关键,调试的过程就是不断的写打印信息,光靠猜是不行的。
这就是我对多线程下数据库遇到的一些问题进行总结,不足之处以后会补充
本人水平也有限,刚毕业的菜鸟,只是希望能对同样遇到问题的朋友有所帮助。哈哈
边栏推荐
- SMIC won the lawsuit in the United States, proving that independence can lead to more long-term development
- 《Feature-metric Loss for Self-supervised Learning of Depth and Egomotion》论文笔记
- 芯片供给过剩迹象明显,ASML不再是香饽饽,投资机构大举做空
- There are obvious signs of oversupply of chips, ASML is no longer a pastry, and investment institutions are shorting on a large scale
- Intel和台积电的先进工艺阻力越来越大,中国芯片有望缩短差距
- Citus 11 for Postgres 完全开源,可从任何节点查询(Citus 官方博客)
- 04. New features of redis: Interpretation of multithreading model
- The first phase of takin open source training camp is coming! Teach you to complete the full link voltage test hand in hand!
- Solon 1.8.3 release, cloud native microservice development framework
- Redis core: usage specification
猜你喜欢

Xidian AI ranked higher than Qingbei in terms of AI major, and Nantah ranked first in China in terms of Software Science in 2022

一款完整开源的物联网基础平台

Application configuration management, basic principle analysis

IAAs, SaaS, PAAS, DAAS concepts

MySQL advanced - personal notes

The backbone of the top 100 security companies! Meichuang technology was selected into the 2022 China top 100 Digital Security Report

is not allowed to connect to this mysql server

MySQL - library operation

年轻人不愿换手机,因选择了更耐用的iPhone,国产手机参数论失效

中芯国际据理力争赢了美国诉讼,证明独立自主才能有更长远的发展
随机推荐
NLog自定义Target之MQTT
There are obvious signs of oversupply of chips, ASML is no longer a pastry, and investment institutions are shorting on a large scale
导航栏切换,留言板,文本框失去焦点
MySQL advanced - personal notes
TS - Enumeration
FastAPI Web框架 [Pydantic]
[ZZ] OWT server: audio and video forwarding diagram
02. Redis Blockbuster: viewing core principles from high-frequency problems
Summary of mapping methods (chain mapping method using hash map)
Where is the cow in Shannon's information theory?
Dapr advanced-01-debug dapr
Citus 11 for Postgres is completely open source and can be queried from any node (citus official blog)
Map集合遍历,添加替换,删除元素
JobService的使用
The delimiter connects the list string without secondary processing joiner on(). join()&&String. join(“,“, list)
The third part of the procedure
How to learn function test? Ali engineer teaches 4 steps
Summary of embedded development -- General Catalog
Swift 之返回按钮
Matplotlib 绘制圆环图的两种方法!
https://download.csdn.net/download/storylsl/4176013?spm=1001.2014.3001.5503