我有一个不会改变的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,然后重新调用该调用可以缓解该问题.我不认为这是一个修复,但如果真的是正确的事情那么我会这样做.