bcb中Sqlite多线程读、写数据出现database is locked,请教高手解决?
本人程序基本结构是这样:
主线程(应用程序)+子线程;主线程使用一个Sqlite实例,每启动一个子线程后子线程都会自己单独创建一个Sqlite实例,给子线程使用;
现在问题是:
当子线程在同时读写数据库时,主线程对数据库进行了大量的修改后,主线程会忙几秒钟。主线程恢复正常后,子线程会出现2-4条insert语句和select语句错误,错误提示都为"database is locked"。请问有什么好的方法能避免这种状况的发生吗?
我在Sqlite中使用了互斥量进行加锁和解锁;小弟分数不多,在这里全给了,忘朋友们帮帮忙,谢谢!
[解决办法]
Sqlite多线程操作不太可靠.且效率低下,以前测试过,它只适合单机单线程的简单应用
如果你真的是用于应用而非个人测试.建议使用Embedded Firebird,它与BCB配合开发桌面应用,方便又可靠且效率是我在桌面数据库测试中最高的.
[解决办法]
Sqlite 的句柄不可以跨线程传递.
你要线程就要自己封装.
而且 这个数据库 在批量数据操作时候使用不使用事务效率相差很大
[解决办法]
有人封装过<使用>
[打开-<使用>- 关闭]
也就是同一时刻只有一个Sqlite实例被打开. 那么正常打开退出,操作等没有异常呀什么发生,就不会在同一目录下产生一个临时文件或者rollback文件,这个时候也就不提示你锁定了.
Sqlite 自己带的事务琐 貌似不好用, 我在一个循环里面不挺的尝试上百次以后居然就进去了.
这个时候我另外一个事务 我还没有放开呢. 晕呀.