Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 避免sqlite3数据库被锁定_C++_Linux_Sqlite - Fatal编程技术网

C++ 避免sqlite3数据库被锁定

C++ 避免sqlite3数据库被锁定,c++,linux,sqlite,C++,Linux,Sqlite,我有一个使用sqlite(3.7.3)的多线程应用程序 我遇到了数据库锁定错误,这个错误似乎非常普遍。 我想知道在我的情况下如何避免它 让我描述一下我正在建造什么。对不起,没有代码,太大太复杂了 我有大约8个线程同时访问数据库。这些线程中的任何一个都可以同时读或写 数据库中表中的每一行都有一个文件路径,该路径指向一个资源+与该资源相关的其他属性 3个值得注意的字段是readers、status和del 每次线程从资源中读取时,读卡器都会增加,但仅当状态>0且del=0时 因此,我有一些SQL可以

我有一个使用sqlite(3.7.3)的多线程应用程序

我遇到了数据库锁定错误,这个错误似乎非常普遍。 我想知道在我的情况下如何避免它

让我描述一下我正在建造什么。对不起,没有代码,太大太复杂了

我有大约8个线程同时访问数据库。这些线程中的任何一个都可以同时读或写

数据库中表中的每一行都有一个文件路径,该路径指向一个资源+与该资源相关的其他属性

3个值得注意的字段是readers、status和del

每次线程从资源中读取时,读卡器都会增加,但仅当状态>0且del=0时

因此,我有一些SQL可以

UPDATE resource set readers=readers+1 where id=? AND del=0 AND status>0
之后,我检查更新的行数。它应该只有1。 之后,我尝试用select读回该行。即使失败了,我也会这么做 更新,因为我需要知道它失败的原因

我尝试在事务中包装更新和选择,但没有帮助。 我已经检查过了,我也在给我的陈述打电话

现在,我认为sqlite默认序列化。我尝试了两种打开模式,但仍然出现相同的错误

在你问之前,不,我不打算去mysql。我绝对需要零配置

有人能提供一些关于如何避免此类问题的建议吗?我应该将读卡器锁移出数据库吗?如果我这样做,我应该用什么机制来取代它?我在C++下使用Linux,并使用了Boost库。 编辑:
有趣的是,在我的更新呼叫后添加COMMIT可以显著改善情况。

打开数据库时,应该配置“忙超时”

int sqlite3_busy_timeout(sqlite3*, int ms);

第一个问题:您是否尝试将一个连接与所有八个线程一起使用?如果是这样,请确保每个线程都有自己的连接。我不知道有哪个数据库像这样

另请查看常见问题解答:

显然,必须将SQLite_THREADSAFE预处理器选项设置为1来编译SQLite。他们确实有办法确定这是否是你的问题


另一个问题是,写入只能从一个进程安全地进行。

您好,是的,我试过了。这有点帮助。但即使将其设置为高达1秒,仍会遇到锁定问题。我已经启用了共享缓存模式,这似乎比繁忙超时更有帮助。我打算两个都试试。结果是sqlite对我的应用程序来说太难了。所以我把readers字段移到了内存中。这提高了大约10000%的性能,而且我对硬盘的访问更少。是的,每个线程一个连接。我将检查threadsafe预处理器选项。但我觉得这是默认设置。更频繁地提交允许对数据库文件使用更细粒度的独占锁,这将减少读卡器等待解锁表的时间。这是以增加日志文件开销为代价的。查看更多信息。