SQLite并发连接问题

时间:2013-04-20 20:01:36

标签: vb.net system.data.sqlite sqlite

我正在研究VB.NET应用程序。 根据应用程序的性质,一个模块必须每秒监视数据库(SQLite DB)。此监视由简单的select语句完成,该语句运行以根据某些条件检查数据。 其他模块在同一SQLite DB上执行select,Insert和Update语句。 在SQLite并发select语句工作正常,但我很难找到,为什么它不允许Inset和Update。 我知道这是一个基于文件的锁,但无论如何要完成它吗? 实际上,每个模块都会打开并关闭与DB的连接。 我已经限制用户通过GUI设计一次运行单个语句。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

如果您的数据库文件不在网络上,则可以通过启用WAL mode来允许一定量的读/写并发。

但也许您应该只使用一个连接并为所有数据库访问执行自己的同步。

答案 1 :(得分:0)

您可以使用某种锁定机制来确保数据库在多线程情况下工作。根据您所说的,您的应用程序是一个读取密集型应用程序,您可以考虑使用ReaderWriterLock或ReaderWriterLockSlim。 (有关详细信息,请参阅herehere

如果您只有一个数据库,那么只创建一个锁实例就可以了;如果您有多个数据库,则可以为每个数据库分配一个锁。每次执行某些读取或写入操作时,请在执行操作之前输入锁定(通过EnterReadLock()为ReaderWriterLockSlim,或者通过AcquireReaderLock()为ReaderWriterLock),并在您完成退出锁定之后。请注意,您可以将锁的出口放在finally子句中,以免忘记释放它。

上述策略正在我们的生产应用程序中使用。在您的情况下使用单个线程并不是一件好事,因为您必须考虑性能。