SQLite的性能不佳,大写会带来很少的读取

Dav*_*rtz 8 sqlite multithreading

相关问题:如何在多线程应用程序中使用SQLite.

我一直试图在多线程程序中从SQLite3中获得不错的性能.除了写入延迟之外,我对它的性能印象非常深刻.这不是它的错,它必须等待磁盘旋转才能提交数据.但是在这些写入期间阻塞读取,即使它们可以从缓存中读取,也是非常难以忍受的.

我的用例涉及大量的小型读取操作,以通过索引字段获取一个小对象,但延迟对于这些操作很重要,因为它们有很多.写入很大并且累积到单个事务中.由于完成写入,我不希望读取具有巨大的延迟.

我首先使用单个连接与互斥锁来保护它.但是,当写入线程正在等待事务完成时,读取器在磁盘I/O上被阻止,因为在编写器释放它之前它们无法获取互斥锁.我尝试使用多个连接,但后来我得到SQLITE_LOCKEDsqlite3_step,这意味着必须重新设计所有的阅读代码.

我的写逻辑目前看起来像这样:

  1. 获取连接互斥锁.
  2. START TRANSACTION
  3. 做所有的写作.(通常是10到100个小的.)
  4. END TRANSACTION - 这是它阻止的地方
  5. 释放互斥锁.

有什么解决方案我不知道吗?如果条目在缓存中而不必重写所有读取代码来处理SQLITE_LOCKED,重置和重试,是否有一种简单的方法可以让我的读者不必等待磁盘完成旋转?

CL.*_*CL. 6

要允许多个读取器和一个写入器同时访问数据库,请启用预写日志记录.

WAL适用于小事务,因此您不需要累积写入.

请注意,WAL不适用于网络文件系统,为了获得最佳性能,需要定期检查点.