gpt4 book ai didi

c++ - SQLite C++ 'database is locked' 当多个进程以只读模式访问数据库时

转载 作者:IT王子 更新时间:2023-10-29 06:29:27 31 4
gpt4 key购买 nike

我有一个 不会改变 的 sqlite 数据库。

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

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

根据 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: 'database is locked'

而失败

错误代码 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 的调用包装在循环该函数的函数中,同时返回 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;
}

关于c++ - SQLite C++ 'database is locked' 当多个进程以只读模式访问数据库时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26378823/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com