nangua111111 发表于 2013-5-14 23:25:02

sqlite 出现 data locked 是什么原因

本帖最后由 nangua111111 于 2013-5-14 23:34 编辑

我是从网上抓去数据 ,然后提取 比较时间,第一次运行没有问题,但是循环到第二遍的 时候出现 sqlitedata locked。 这个是什么原因 ,导致我写入不了数据

!   SQLite.au3 Error
--> Function: _SQLite_Close
--> Error:    unable to close due to unfinalized statements or unfinished backups

SQLite.au3 Error
--> Function: _SQLite_Exec
--> Query:    UPDATE ssfs SET wzmc = '古典风格' WHERE hmhp = 't';
--> Error:    database is locked

nangua111111 发表于 2013-5-15 00:21:32

unable to close due to unfinalised statements,Qt的SQL模块的问题


unable to close due to unfinalised statements,Qt的SQL模块的问题

造成“unable to close due to unfinalised statements”错误的原因有狠多,本座这里说的是QT的问题。

SQLITE要求,在关闭数据库之前,所有活跃的查询都要终结掉。如果在终结掉那些查询之前就关闭数据库,则关闭操作会失败,并且得到“unable to close due to unfinalised statements”这样的错误。

QT的SQLITE驱动有漏洞,API并没有提供对应的函数来让程序猿显式地终结那些活跃状态的查询对象,而用来关闭数据库连接的QSqlDatebase::close函数又不做这些终结操作。这样就导致某些(其实狠频繁地出现)情况下无法关闭SQLITE数据库,文件描述符被继续占用着。而再又打开SQLITE数据库的话,又增加咯程序打开的文件描述符的数量,并且也不能关闭。如此下去,直到文件描述符达到系统限制,终于无法再连接到SQLITE数据库咯。本座今天碰到的就是这样的问题,从/proc伪文件系统中看到自己的程序打开咯1024个文件,其中绝大部分都是某个SQLITE数据库文件。

参考这里:https://codereview.qt-project.org/#change,20121

据说QT开发者在QT4.8.2中已经解决咯这个问题,有条件的哥哥们可以升级到QT4.8.2试试,本座目前用的是QT4.8.1,要等到QtSDK中的QT版本升级到4.8.2才能升级。像本座这样没条件升级的哥哥就要用另外的办法来绕过咯。

要绕过也简单,对于同一个SQLITE数据库,在程序中打开一个SQLITE数据库连接之后,一直用这个连接,不再关闭,到最后程序退出的时候再关闭SQLITE连接。那个时候,在关闭之前销毁所有存在的查询对象,就可以正常关闭SQLITE数据库咯。

总之,在升级到QT4.8.2之前,不要频繁关闭SQLITE数据库,那是无用功。

nangua111111 发表于 2013-5-15 00:21:48

{:face (229):} 难道是 udf 原因

nangua111111 发表于 2013-5-15 00:25:22

SQLite做为客户端应该很给力,但如果做为服务端应用,在并发处理上会伤感情的。网络上回答
页: [1]
查看完整版本: sqlite 出现 data locked 是什么原因