SQLite问题-DB被锁定的解决方法



我有两个进程连接到同一个DB。第一个用于从数据库中读取,第二个用于向数据库中写入。第一个进程通过linux上的消息队列向第二个进程发送用于执行的写过程。

每一条SQL语句都是在prepare、step、finalize例程中执行的;其中准备和步骤在10000次循环中进行,直到成功(这样做是为了克服DB锁定问题)。

要添加表格,我执行下一个步骤:

  1. 第一个进程通过msg-q向第二个进程发送请求,以在journal_mode=OFF模式下添加一个表并在其行中插入垃圾。

  2. 则第一个过程检查现有表,以便它可以继续其算法。(它在迭代之间用usleep命令在循环中检查它。)

问题是第二个进程被卡在"PRAGMA journal_mode=OFF;"的步骤执行中因为它说DB被锁定了(在这里,我也使用usleep的10000次迭代循环来检查DB空闲的10000次时间,正如我之前提到的)。

当我在"检查现有表"循环中向第一个进程添加关闭连接的操作时,第二个进程是可以的。但现在,当我添加表和值时,我会在Step语句中得到"callback requested query abort"。

这里发生的事情有什么帮助吗?

使用WAL模式。它允许一个作家和任何数量的读者没有任何问题。你不需要检查锁定状态并重试等。

WAL限制:DB必须在本地驱动器上。

性能:大型事务(1000次插入或类似)比传统的回滚日志慢,但除此之外,速度非常相似,有时甚至更好。感知性能(UI等待DB写入完成)显著提高。

WAL是一项新技术,但已经在Firefox、Adroid/iOS手机等中使用。我用两个全速运行的线程进行了测试,一个写,另一个读,没有遇到任何问题。

当采用WAL模式时,您可以简化您的应用程序。

最新更新