难以在C#中的SQLite数据库上运行并发INSERTS

我正在运行许multithreading,每个线程都尝试对一个SQLite数据库执行INSERTS。 每个线程都创建自己与DB的连接。 它们每个都创建一个命令,打开一个Transaction执行一些INSERTS然后关闭事务。 似乎第二个尝试任何东西的线程得到以下SQLiteException:数据库文件被锁定。 我尝试从事务中解包INSERTS以及缩小每个提交中包含的INSERTS的范围而没有实际效果; 后续访问db文件会引发相同的exception。

有什么想法吗? 我很难过,我不知道下一步该往下看……

更新插入代码,以便在遇到指示数据库锁定的exception时,它会稍稍等待并再次尝试。 每次增加等待时间随机增量(“随机退避”算法)。 这应该允许每个线程获取全局写锁。 性能会很差,但代码应该无需重大修改即可运行。

但是,SQLite不适合高度并发修改。 你有两个永久解决方案:

  • 转移到“真正的”数据库,例如PostgreSQL或MySQL
  • 通过一个线程序列化所有数据库修改,以避免SQLite的修改。

要检查两件事:

1)确认您的SQLite版本是使用THREAD支持编译的

2)确认您没有打开数据库EXCLUSIVE

我没有在C#中这样做,而是在Android中,但是我通过在包装类的整个生命周期内始终在拥有它的包装类中打开sqlite数据库来解决这个“数据库被锁定”错误。 在这个类中完成的每个插入都可以在它自己的线程中(因为,根据你的数据存储情况,SD卡与设备内存等,db写入可能需要很长时间),我甚至尝试限制它,制作一个打开一次插入线程,每个都处理得很好,因为插入方法不必担心打开/关闭数据库。

我不确定持久的数据库生命周期是否被认为是好的风格(在大多数情况下它可能被认为是坏的),但是现在它工作得很好。