2012-02-19 17 views
1

+訪問,我想了解的可能途徑與SQLite的工作的時候,可以有多個線程在DB工作。 基於stackoverflow和其他網站的各種反應,似乎會有鎖定問題時,從多個線程使用相同的sqlitehelper實例。在一個典型的java應用程序中,我希望實例指的是應用程序的不同線程使用的sqlite helper類型的單個對象。在這種情況下,我猜想,鎖定是正確使用synchronized塊的問題。 [糾正我在這裏,因爲我不喜歡這種在這裏查看sqliethelper實例的方式]的Android SQLite的:鎖定從多個線程

我關心的是共享相同的數據庫:當一個實例化不同線程的sqlite助手[即每個線程都有自己的對象實例]但在同一個數據庫上工作[這個我猜是更接近於具有相同的數據庫實例]。 在這種情況下,我會頻繁發生數據庫鎖定錯誤。即使線程在不同的數據庫表上工作,也會發生這種情況。

在我的申請數據庫可以由用戶交互通過應用或通過服務器[週期性同步]獲得的數據來更新。有一段時間,當同步過程和用戶​​活動重疊時,我會遇到鎖定問題。由於這種數據處理模式似乎在應用程序與服務器同步時很常見,因此想知道如何處理併發問題會導致鎖定問題。

我想明白這一點,因爲如果這樣勢必會總是那麼可能發生需要僅做一個對數據庫的處理程序,並實現了隊列,爲避免鎖。但是這意味着完整的應用程序需要意識到數據庫可能不會立即得到更新,他們需要實現監聽器來知道數據在數據庫中實際更新的時間。

感謝 普拉迪普

回答

0

據我所知SQLite是用於single process usage。不管你一直需要從一個線程訪問數據庫。您可以從多個客戶端進行選擇,但一次只能從一個客戶端進行選擇。而其他讀者和作者將會在此期間鎖定。

作爲一個側面說明 - 數據庫訪問可以幾乎不被認爲是瞬間的。

+0

而其正確的,數據庫訪問是幾乎瞬時的,但底層的東西是隱藏的。我將在典型編程中與同步調用的瞬時不同,一個同步獲得寫操作的結果。如果結果是成功的,可以立即讀取相應的數據。但是我的問題在這裏,如果鎖將要發生(即使兩個線程在不同的表上工作),並且讓我在數據庫上實現排隊行爲,那麼這與典型的數據庫編程有什麼不同甚至J2SE項目。 – user1050134 2012-02-19 16:04:57

+1

你實際上是不正確的。多個進程可以訪問SQLite數據庫。我有2個android應用程序讀取,插入,從同一個數據庫中刪除。 – JPM 2012-03-27 15:13:50

+0

請閱讀我提供的鏈接。它說: 「多個進程可以同時打開同一個數據庫,多個進程可以在同一時間做一個SELECT但只有一個進程可以在任何時刻進行更改的數據庫,但。」 我會信任數據庫本身的作者。我想知道你是如何測試這些同步讀寫的? – 2012-03-31 11:12:46