multithreading - SQLite 共享缓存多线程读取

标签 multithreading sqlite shared-cache

我正在 Ubuntu 虚拟机上开发多线程 sqlite 数据库应用程序,该虚拟机分配了 4 个处理器。我正在使用 sqlite 版本 3.7.13。我创建了一个测试来验证多个线程/连接是否可以同时从数据库中读取。

我有两个可执行文件。第一个可执行文件只是创建一个数据库,在该数据库中创建一个表,将 50 个项目插入该表,然后关闭数据库。这根本不涉及任何多线程,只是为了提供一个包含条目的数据库。

第二个可执行文件创建多个线程以从数据库中读取并等待它们完成并记录所有线程完成所花费的时间。每个线程执行以下操作: - 使用 sqlite_open_v2() 创建一个数据库连接,这样每个线程都有自己的连接到从第一个可执行文件创建的数据库 - 在一个数据库表上执行 100000 次选择(每次选择查询表中的一行) -关闭数据库连接

当我在每个线程中将 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 执行所有读取, ETC。)。但是,似乎每个单独事务的读取都是串行完成的,或者其他原因正在减慢共享缓存中的数据库。

为什么我在共享缓存模式下添加线程时看到的时间增加如此之多?有没有办法解决这个问题并仍然使用共享缓存模式?

感谢您的帮助。非常感谢。

最佳答案

目前,我只能说在共享缓存模式中,每个线程都会对每个请求多次执行额外的read mutex lock()(锁在共享缓存,锁主控表,锁定请求的表)。当然,它有一些开销。

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

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

关于multithreading - SQLite 共享缓存多线程读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11905537/

相关文章:

javascript - JS SQLITE,读取一个数据库并写入另一个数据库

android - SQLite3,组合多个 INSERT 语句?

node.js - 在许多用户之间共享 Redis Db

java - 使用同步时不需要原子引用

c# - 清理散落着 InvokeRequired 的代码

python - 在 Tensorflow 中的线程之间共享变量

SVN 1.8,当 SVN (1.7) 更新时,数据库已损坏 : 'sqlite: data base image malformed (S11)' , 并且重新索引不起作用'

caching - Windows Azure 角色内缓存与共享缓存

jpa - EclipseLink 与 java.util.Date 字段的意外共享缓存行为

python - 我需要制作一个多线程程序(python)