SQLite C ++'数据库被锁定'当多个进程以只读模式访问db时

时间:2014-10-15 09:17:53

标签: c++ sql database sqlite

我有一个无法更改的sqlite数据库

使用sqlite3_open_v2以 SQLITE_OPEN_READONLY 模式打开数据库连接的多个进程。每个进程都是单线程的

使用官方C/C++ Interface的单一合并C源文件从MSVC项目建立连接。

根据SQLite常见问题multiple processes running SELECTs is fine

打开数据库后的每个进程都会创建4个准备好的 SELECT 语句,每个语句都有2个可绑定值。

在执行过程中,语句(一次一个)根据需要重复调​​用它们

  • sqlite3_bind_int
  • sqlite3_bind_int
  • sqlite3_step(返回SQLITE_ROW时)
  • sqlite3_column_int(虽然有一行)
  • sqlite3_reset

重复使用准备好的语句,因此不会在每个语句上调用finalize,直到程序结束。最后,数据库在执行结束时关闭。

问题任何这些操作都可能因错误代码= 5而失败:'数据库被锁定'

错误代码5为SQLITE_BUSY,网站声明

  

"表示与单独的数据库连接发生冲突,可能是在单独的进程中#34;

互联网的其余部分似乎同意多个READONLY连接没问题。我已经过了一遍又一遍,看不出有什么不妥(我不能在这里发帖,我知道,没有帮助)

所以我转向你们,我可能会错过什么?

编辑1 : 数据库位于本地驱动器上,文件系统是NTFS,操作系统是Windows 7。

编辑2 : 将所有sqlite3调用包含在无限循环中,检查是否返回了SQLITE_BUSY,然后重新调用该调用可以缓解此问题。我不认为这是一个解决办法,但如果确实这样做是正确的,那我就去做。

1 个答案:

答案 0 :(得分:2)

所以我使用的工作答案是在返回SQLITE_BUSY时将所有对sqlite的调用包装在循环该函数的函数中。似乎没有一个简单的替代方案。

const int bindInt(sqlite3_stmt* stmt, int parameterIndex, int value)
{
    int ret;
    do
        ret = sqlite3_bind_int(stmt, parameterIndex, value);
    while (ret == SQLITE_BUSY)
    return ret;
}