qt对sqlite数据库多线程的操作
Posted yantuguiguziPGJ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qt对sqlite数据库多线程的操作相关的知识,希望对你有一定的参考价值。
对数据库多线程的操作:
一开始写的程序由于没有注意到多线程对数据库和对整个程序的影响,虽然程序没有报错,但是在后期的长时间调试的时候暴露出了很多问题。
首先是程序运行两个小时后会出现数据库死锁无法操作的问题,前期通过给数据库操作进行加锁仍无法解决该问题。后经过查找资料,经过解决了该问题。所以在此总结一下多线程数据操作时应该进行的处理:
这是一段标准的多线程前提下对数据库进行的操作(我自认为的哈),将会按照这段代码进行说明。
1多线程下的各个线程或是定时器数据库驱动加载需要独立进行
之前写程序,当一个程序多个类需要操作同一个数据库时,处理结果是将数据库的QsqlDatabase作为参数传给需要的子类。这样做在单进程的程序里没有太大的问题。但是在多线程里,由于线程的特殊性,这样做就会出现问题。所以最好的办法就是,在每个线程或是定时器里,单独的进行数据库驱动的加载,定义一个不同的名字。并且在使用中,QsqlQuery变量一定要设置当前所在现成的QsqlDatabase作为参数:
2 多线程操作数据库一定要加锁
这点一般都会做,需要注意一点的就是如果程序里如果有加数据库打开判断的话,一定要记得打开失败return的时候给解锁,不然也会非常容易的造成死锁。
3 数据库最好是每次操作的时候再打开,用完就关闭,不要一直打开不关
数据库打开的时候会有一个临时文件,将数据都转移到临时文件进行操作,如果不关闭的话,这个临时文件是不会清除的,也就是说你的另一个线程正好要操作数据库,那么数据库里面是没有数据的,所以,一定要每次操作的时候打开关闭。
4 重点说一下QsqlQuery 这个变量的问题
前期写代码测试的时候发现,在通过如上办法后,多线程下数据库仍然是经过俩小时必然思索,纠结了很久后开始换个思路打印一下调试信息,找了个数据库操作最频繁的代码段进行调试,估摸着打印了一下关闭数据库的时候的调试信息,发现虽然参数结果是-1,也就是正常关闭的参数,但是真正正常关闭数据库的错误信息后两个参数是空的,而我的打印出来后两个参数是数据库错误关闭的说明。这就很让人费解,能出错的也就只有QsqlQuery了,可是我再加上clear()和设置不同的变量名来测试发现,打印信息还是不正常,终于在咨询高人后得到的办法就是在每次声明QsqlQuery变量的时候,都加上一对花括号来设定这个变量的作用域生命周期,执行完这段代码就让它自己结束生命,果然,这次打印信息正常了。但是这个变量对内存的影响至今也不了解,为什么会产生这样的问题。以后水平提高可能会有所顿悟,但是现在只要能解决问题就好。
其他的数据库操作什么的不多说了。这次解决问题,学到的东西不少,要更加理解了一个道理,没有错误的代码不一定是优秀的代码。另外这次能比较快的定位出问题所在是关键,调试的过程就是不断的写打印信息,光靠猜是不行的。
这就是我对多线程下数据库遇到的一些问题进行总结,不足之处以后会补充
本人水平也有限,刚毕业的菜鸟,只是希望能对同样遇到问题的朋友有所帮助。哈哈
以上是关于qt对sqlite数据库多线程的操作的主要内容,如果未能解决你的问题,请参考以下文章