2013-04-20 93 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子句中,以免忘記釋放它。

上述策略正用於我們的生產應用中。在您的案例中使用單個線程並不好,因爲您必須考慮性能。