SQLite共享缓存多线程读取

6
我正在开发一个多线程的sqlite数据库应用程序,它运行在一个Ubuntu虚拟机上,该虚拟机分配了4个处理器。我使用的是sqlite版本3.7.13。我创建了一个测试来验证多个线程/连接可以同时从数据库中读取。
我有两个可执行文件。第一个可执行文件仅创建一个数据库,在该数据库中创建1个表,在该表中插入50个项目,然后关闭数据库。这不涉及任何多线程操作,只是提供了一个具有条目的数据库。
第二个可执行文件创建多个线程从数据库中读取,并等待它们完成并记录所有线程完成所需的时间。每个线程执行以下操作: -使用sqlite_open_v2()创建数据库连接,以便每个线程都有自己的独立连接到来自第一个可执行文件创建的数据库 -在一个数据库表上执行100000个SELECTS(每个SELECT查询表中的一行) -关闭数据库连接
当我以SQLITE_OPEN_READWRITE指定为每个线程的sqlite_open_v2标志时,我得到了执行所有查询所需的总时间的以下结果:
1个线程 - 0.65秒 2个线程 - 0.70秒 3个线程 - 0.76秒 4个线程 - 0.91秒 5个线程 - 1.10秒 6个线程 - 1.28秒 7个线程 - 1.57秒 8个线程 - 1.78秒
这些结果符合预期,因为随着添加线程,时间略微增加(可能是由于线程之间的上下文切换和其他原因),这意味着读取基本上是并行进行的。
然而,当我以SQLITE_OPEN_READWRITE | SQLITE_OPEN_SHAREDCACHE标志运行相同的测试时,我得到以下结果:
1个线程 - 0.67秒 2个线程 - 2.43秒 3个线程 - 4.81秒 4个线程 - 6.60秒 5个线程 - 8.03秒 6个线程 - 9.41秒 7个线程 - 11.17秒 8个线程 - 12.79秒
从这些结果来看,在共享缓存模式下,某些东西会阻止数据库中发生多个读操作。我已经验证了不同的线程确实是并行运行的(线程4读取,线程8读取,线程2读取等,而不是线程1执行所有读取,线程2执行所有读取,线程3执行所有读取等)。但是,似乎每个单独事务的读取都是串行进行的,或者共享缓存中的某些其他东西正在减慢数据库速度。
为什么在共享缓存模式下随着添加线程而看到如此高的时间增长?有没有办法修复这个问题并仍然使用共享缓存模式?
感谢任何帮助。非常感谢。

你能分享一下你的代码吗?或许你已经有答案了? - abrahab
1个回答

1

目前,我只能说在共享缓存模式下,每个线程在每次请求时都会执行额外的读互斥锁(lock())几次(在共享缓存、主表和所需表上进行锁定)。当然,这会带来一些开销。

为了避免这种情况,您可以使用PRAGMA read_uncommitted = true;,但是如果另一个数据库连接在读取时修改表,则可能导致查询结果不一致,但这也意味着以读未提交模式打开的连接的读事务既不能被阻塞,也不能被任何其他连接阻塞。

(您能提供您的代码吗?)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接