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

前端之家收集整理的这篇文章主要介绍了当多个进程以只读模式访问db时,SQLite C’数据库被锁定前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个不会改变的sqlite数据库.

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

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

根据sqlite FAQ 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,网站说明了这一点

“indicates a conflict with a separate database connection,probably in a separate process”

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

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

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

编辑2:
将所有sqlite3调用包含在无限循环中,检查是否返回了sqlITE_BUSY,然后重新调用调用可以缓解该问题.我不认为这是一个修复,但如果真的是正确的事情那么我会这样做.

解决方法

所以我使用的工作答案是在返回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;
}

猜你在找的Sqlite相关文章