加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 19:00:59 所属栏目:百科 来源:网络整理
导读:我有一个不会改变的sqlite数据库. 使用sqlite3_open_v2以SQLITE_OPEN_READONLY模式打开数据库连接的多个进程.每个进程都是单线程的 使用官方C/C++ Interface的单合并C源文件从MSVC项目建立连接. 根据SQLite FAQ multiple processes running SELECTs is fine
我有一个不会改变的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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读