2012-08-10 84 views
4

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

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

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

当我运行这个测试与指定为标志在每个线程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执行所有读取,等等。)。但是,似乎每个单独事务的读取操作都是以串行方式完成的,或者其他操作正在减慢共享缓存中的数据库速度。

为什么我在共享高速缓存模式下添加线程时会出现如此高的增长时间?有没有办法解决这个问题,仍然使用共享缓存模式?

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

+0

你能分享你的代码吗?也许你已经有了答案? – abrahab 2014-08-15 14:21:04

回答

0

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

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

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