小编Eri*_*Sum的帖子

SQLite SharedCache MultiThread读取

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

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

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

当我在每个线程中使用指定为sqlite_open_v2的标志的SQLITE_OPEN_READWRITE运行此测试时,我得到以下结果以便执行所有查询的总时间:

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执行其所有读取,等等.).但是,似乎每个单独事务的读取都是串行完成的,或者其他东西正在减慢共享缓存中的数据库速度.

为什么我在共享缓存模式下添加线程时看到如此高的增长,而不是没有呢?有没有办法解决这个问题,仍然使用共享缓存模式?

谢谢你的帮助.非常感谢.

sqlite multithreading shared-cache

5
推荐指数
1
解决办法
1682
查看次数

标签 统计

multithreading ×1

shared-cache ×1

sqlite ×1