我在Winforms上的C#
中有一个类,它不是线程安全的,但我希望它是。相反,SQLite
一直在错误地说数据库被锁定..数据库被锁定..
但是我已经计划好了:有一个队列是FIFO(很好) BUT 这个工作线程(非gui)正在与GUI竞争,因为有一些gui需要进入数据库的事件,他们正在互相攻击......导致项目失败,然后失控。
我真正想要的是能够从我需要的任何线程获得SQLite连接并期望它保持不变。我一直在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();
答案 0 :(得分:0)
你不能“强迫SQLite不要那么挑剔” - 它告诉你,如果你做了你想要做的事情,就会发生坏事 - 比如崩溃或数据库损坏,或者更糟。
我建议您研究在自己的线程中包装对SQLite的访问,然后将其视为具有正确的线程可阻塞接口的服务器。尽量避免使用共享资源。在自己的线程上应该使db满意,并且您的其他代码可以根据需要阻止或轮询,直到可以访问。作为一个好处,您将获得更多的多核灵活性。
如果你不能这样做,你可以尝试使用'监视器',有时也称为“同步”呼叫。但是要非常清楚这是一条铺满了陷阱的路径,这些陷阱在活动结束后很容易被发现。
HTH