我有两个连接到同一个数据库的进程。 第一个用于从DB读取,第二个用于写入DB。 第一个进程通过linux上的message-queue发送写入程序以执行第二个进程。
每个SQL语句都在prepare,step,finalize例程中进行;准备和步骤以10000次循环进行直到它成功(这样做是为了克服数据库锁定问题)。
要添加表格,请执行下一步骤:
第一个进程通过msg-q向第二个进程发送请求,以添加表并在journal_mode = OFF模式下在其行中插入垃圾。
然后第一个进程检查现有表,以便它可以在其算法中继续。 (它在迭代之间使用usleep命令在循环中检查它。)
问题是第二个过程停留在'PRAGMA journal_mode = OFF;'的步骤执行中因为它说数据库被锁定了(在这里,我使用10000次迭代的循环来检查数据库释放10000次,如前所述)。
当我在'check for existing table'循环中添加第一个进程时,关闭连接的操作,第二个进程是可以的。但是现在当我添加表格和值时,我会在步骤声明中获得“回调请求查询中止”。
这里有什么帮助吗?
答案 0 :(得分:2)
使用WAL模式。它允许一个作家和任何数量的读者没有任何问题。您不需要检查锁定状态并执行重试等。
WAL限制:数据库必须位于本地驱动器上。
性能:大型事务(1000次插入或类似)比经典回滚日志慢,但除此之外速度非常相似,有时甚至更好。感知性能(等待DB写入完成的UI)显着改善。
WAL是一项新技术,但已经在Firefox,Adroid / iOS手机等中使用过。我使用全速运行的2个线程进行测试 - 一次写入,另一次读取 - 并且没有遇到任何问题。
采用WAL模式时,您可以简化应用程序。