我有一个sqlite数据库,不会更改。
多个进程,它们使用sqlite3_open_v2以 SQLITE_OPEN_READONLY 模式打开数据库连接。每个进程都是单线程的
这些连接是使用官方C/C++ Interface的单个合并C源文件从MSVC项目建立的。
根据SQLite FAQ multiple processes running SELECTs is fine
打开数据库后,每个进程都会创建4个准备好的 SELECT 语句,每个语句具有2个可绑定(bind)值。
在执行过程中,根据需要(一次一次)重复调用以下语句
准备好的语句将被重用,因此直到程序结束时才对它们的每个调用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;
}