多线程安全SQLite

本文关键字:SQLite 多线程安全 | 更新日期: 2023-09-27 18:13:12

我有一个类是在C#上的Winforms,它不是线程安全的,但我希望它是。相反,SQLite总是错误地说数据库被锁定了。数据库被锁定。

然而我已经计划好了:有一个队列是FIFO(这很好)但是这个工作线程(非gui)正在与gui竞争,因为有一些gui事件需要去数据库,而且它们正在相互撞击。导致项目失败,然后失控。

我真正想要的是能够从我需要的任何线程获得SQLite连接,并期望它保持up。我一直在MySQL中做这种事情,近15年来它从来没有打嗝过一次。

所以,我的问题是

是否有a)一个防子弹的方法让SQLite查询只是等待,是否有一种方法手动锁定事务(可能在它自己的线程中?)或b)是否有一种简单的方法来强制SQLite不那么挑剔。有很多SQL正在进行中,只有当我扩展Winforms应用程序时,这些问题才变得明显。我可不能完全重写一遍。

顺便说一下,我使用这个DefaultTimeout来尝试获得一些收益,但这也只是降低了问题阈值,感觉不是最佳的

SQLiteConnectionStringBuilder builder = new SQLiteConnectionStringBuilder();
builder.DefaultTimeout = 200;
builder.DataSource = "some.sqlite";
builder.Version = 3;
conn = new SQLiteConnection(builder.ConnectionString);
conn.Open();

多线程安全SQLite

你不能强迫SQLite不那么挑剔-它会告诉你,如果你做你想做的事情,不好的事情会发生-例如崩溃,或数据库损坏,或更糟。

我建议你考虑把对SQLite的访问包装在一个线程中,然后把它当作一个具有适当的线程可阻塞接口的服务器。尽量避免使用共享资源。在它自己的线程上应该使db高兴,并且您的其他代码可以根据需要阻塞或轮询,直到访问成为可能。作为一个好处,您将获得更多的多核灵活性。

如果你不能这样做,你可以尝试使用"监视器",有时被称为"同步"调用。然而,要非常清楚,这是一条布满陷阱的道路,只有在事件发生后才容易发现。

HTH