2010-07-09 83 views
5

民間 我正在實施基於文件的隊列(see my earlier question)使用sqlite。我有以下線程在後臺運行:sqlite數據庫連接/鎖定問題

  1. 線程1將清空內存結構到「隊列」表(插入到「隊列」表中)。
  2. 線程1讀取並「處理」「隊列」表每5到10秒運行一次
  3. 線程3 - 運行非常少,並清除不再需要從「隊列」表中刪除的舊數據,運行真空,因此數據庫文件的大小仍然很小。

現在我想要的行爲是讓每個線程獲得所需的任何鎖定(如果可能,請等待超時),然後完成事務。如果線程不同時運行,那麼確定 - 重要的是事務一旦開始就不會因「鎖定」錯誤(例如「數據庫已鎖定」)而失敗。

我看着transaction documentation但似乎沒有「超時」設施(我正在使用JDBC)。連接中的超時時間可以設置爲大量嗎?

一個解決方案(未嘗試)我能想到的是有一個最大1連接的連接池。因此,一次只能連接一個線程,所以我們不應該看到任何鎖定錯誤。有更好的方法嗎?

Thanx!

回答

2

如果是我,我會使用單個數據庫連接句柄。如果一個線程需要它,它可以在一個關鍵部分(或互斥體或類似的)中分配它 - 這基本上是一個窮人的連接池,池中只有一個連接:)它可以與數據庫做生意。完成後,它會退出臨界區(或釋放互斥鎖或?)。如果您仔細使用單個數據庫連接,則不會出現鎖定錯誤。

-Don

+0

感謝名單唐,這就是我可能最終會做,雖然通過一個DB池設置它會做(和更少的混亂,因爲你是治療像其他數據庫SQLite的更「標準」的方式在代碼中。 – serverman 2010-07-10 13:54:04