我有一个sqlite数据库,不会更改

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

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

根据SQLite FAQ multiple processes running SELECTs is fine

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

在执行过程中,根据需要(一次一次)重复调用以下语句

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

  • 准备好的语句将被重用,因此直到程序结束时才对它们的每个调用finalize。最后,数据库在执行的最后关闭。

    问题是,这些操作中的任何一个都可能因而失败,错误代码= 5:“数据库已锁定”

    错误代码5为SQLITE_BUSY,并且网站指出



    互联网的其余部分似乎都同意多个READONLY连接是可以的。我翻遍了源头,看不到任何错误(我很难过将其发布在这里,我知道,没有帮助)

    因此,我将其转给你们,我可能会丢失什么?

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

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

    最佳答案

    因此,我使用的有效答案是将对sqlite的所有调用包装在返回SQLITE_BUSY时使该函数循环的函数中。似乎没有简单的选择。

    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;
    }
    

    10-06 09:16