2013-04-20 55 views
0

我正在使用VB.NET应用程序。 根据应用程序的性质,一个模块必须每秒钟监视一次数据库(SQLite DB)。这种监控是通过简单的select语句完成的,该语句用于检查某些情况下的数据。 其他模块在相同的SQLite数据库上执行select,insert和update语句。 SQLite并发select语句上的 工作正常,但我在这里很难找出,为什么它不允许插入和更新。 我知道这是一个基于文件的锁,但无论如何要完成它?每个模块,实际上语句打开和关闭到DB的连接。 我已经限制用户通过GUI设计一次运行单个语句。SQLite并发连接问题

任何帮助将不胜感激。

回答

0

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

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

+0

谢谢你的回复。现在我在一个线程(表单)中完成所有工作。即使该线程关闭,第二个线程(相同形式)也会被打开。而且它不是基于网络的文件。不知道如何使用WAL模式。你可以帮助我在VB.NET中的一段代码spinet。 – SOAMad 2013-04-22 20:14:55

0

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

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

上述策略正用于我们的生产应用中。在您的案例中使用单个线程并不好,因为您必须考虑性能。