我有一个无法更改的sqlite数据库。
使用sqlite3_open_v2以 SQLITE_OPEN_READONLY 模式打开数据库连接的多个进程。每个进程都是单线程的
使用官方C/C++ Interface的单一合并C源文件从MSVC项目建立连接。
根据SQLite常见问题multiple processes running SELECTs is fine
打开数据库后的每个进程都会创建4个准备好的 SELECT 语句,每个语句都有2个可绑定值。
在执行过程中,语句(一次一个)根据需要重复调用它们
重复使用准备好的语句,因此不会在每个语句上调用finalize,直到程序结束。最后,数据库在执行结束时关闭。
问题任何这些操作都可能因错误代码= 5而失败:'数据库被锁定'
错误代码5为SQLITE_BUSY,网站声明
"表示与单独的数据库连接发生冲突,可能是在单独的进程中#34;
互联网的其余部分似乎同意多个READONLY连接没问题。我已经过了一遍又一遍,看不出有什么不妥(我不能在这里发帖,我知道,没有帮助)
所以我转向你们,我可能会错过什么?
编辑1 : 数据库位于本地驱动器上,文件系统是NTFS,操作系统是Windows 7。
编辑2 : 将所有sqlite3调用包含在无限循环中,检查是否返回了SQLITE_BUSY,然后重新调用该调用可以缓解此问题。我不认为这是一个解决办法,但如果确实这样做是正确的,那我就去做。
答案 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;
}