sqlite数据库保持locking/不可访问

我有一个sqlite3数据库在一定的访问后仍然locking/不可访问的问题。

行为发生在Ubuntu 10.4和定制(OpenEmbedded)Linux上。 sqlite版本是3.7.7.1)。 Db是一个本地文件。

一个C ++ – 应用程序定期访问数据库(5s)。 每次插入语句都被包装在一个延期交易中。 这只发生在一个线程中。 与db的连接在应用程序的整个生命周期中保持不变。 使用的语句也是持久的,并通过sqlite3_reset重用。 sqlite_threadsafe被设置为1(序列化),日志被设置为WAL。

然后,我用sqlite命令行工具打开sqlite数据库。 我inputBEGIN IMMEDIATE; ,等待> 5s,并提交END;

在此之后应用程序的数据库访问失败: BEGIN TRANSACTION返回代码1(“SQL错误或缺less数据库”)。 如果我在开始之前执行ROLLBACK TRANSACTION ,只是为了确保没有活动的事务,它将返回代码5(“数据库文件被locking”)失败。

有没有人有一个想法如何解决这个问题或有一个想法可能会导致它?

编辑:有一个解决方法:如果所描述的错误发生,我closures并重新打开数据库连接。 这解决了这个问题,但是我现在为什么这么做了。

Sqlite是一个服务器少数据库。 据我所知,它不支持从多个源设计的并发访问。 您正在尝试从应用程序和命令工具访问相同的备份文件,因此您尝试执行并发访问。 这就是失败的原因。

SQLite连接只能从单个线程使用 ,因为它们包含用于确保正确的并发访问的互斥体。 (请注意,SQLite也一次只支持一个更新线程,而且在同一时间没有并发读取;这是作为无服务器数据库的限制。)

幸运的是,SQLite连接在没有做任何事情时相对便宜,像缓存准备语句的成本实际上相当小, 开放尽可能多的,你需要的。

[编辑]:此外,这将解释关闭和重新打开连接的工作:它建立在新线程的连接(并最终确定所有的旧锁等)。