首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

bcb中Sqlite多线程读、写数据出现database is locked,解决

2012-02-04 
bcb中Sqlite多线程读、写数据出现database is locked,请教高手解决?本人程序基本结构是这样:主线程(应用程

bcb中Sqlite多线程读、写数据出现database is locked,请教高手解决?
本人程序基本结构是这样:
主线程(应用程序)+子线程;主线程使用一个Sqlite实例,每启动一个子线程后子线程都会自己单独创建一个Sqlite实例,给子线程使用;
现在问题是:
当子线程在同时读写数据库时,主线程对数据库进行了大量的修改后,主线程会忙几秒钟。主线程恢复正常后,子线程会出现2-4条insert语句和select语句错误,错误提示都为"database is locked"。请问有什么好的方法能避免这种状况的发生吗?
我在Sqlite中使用了互斥量进行加锁和解锁;小弟分数不多,在这里全给了,忘朋友们帮帮忙,谢谢!

[解决办法]
Sqlite多线程操作不太可靠.且效率低下,以前测试过,它只适合单机单线程的简单应用
如果你真的是用于应用而非个人测试.建议使用Embedded Firebird,它与BCB配合开发桌面应用,方便又可靠且效率是我在桌面数据库测试中最高的.
[解决办法]
Sqlite 的句柄不可以跨线程传递.
你要线程就要自己封装.

而且 这个数据库 在批量数据操作时候使用不使用事务效率相差很大
[解决办法]
有人封装过<使用> 
[打开-<使用>- 关闭]
也就是同一时刻只有一个Sqlite实例被打开. 那么正常打开退出,操作等没有异常呀什么发生,就不会在同一目录下产生一个临时文件或者rollback文件,这个时候也就不提示你锁定了.

Sqlite 自己带的事务琐 貌似不好用, 我在一个循环里面不挺的尝试上百次以后居然就进去了.
这个时候我另外一个事务 我还没有放开呢. 晕呀.


探讨
本人程序基本结构是这样:
主线程(应用程序)+子线程;主线程使用一个Sqlite实例,每启动一个子线程后子线程都会自己单独创建一个Sqlite实例,给子线程使用;
现在问题是:
当子线程在同时读写数据库时,主线程对数据库进行了大量的修改后,主线程会忙几秒钟。主线程恢复正常后,子线程会出现2-4条insert语句和select语句错误,错误提示都为"database is locked"。请问……

[解决办法]
它的简单的设计是通过在开始一个事务的时候锁定整个数据文件而完成的。
很容易被锁定的。

热点排行