我正在開發一個使用SQLite作爲主數據存儲方法的應用程序。我有兩個進程爲使用備用入口點的應用程序運行。從不同進程訪問SQLite
我需要從兩個不同的進程訪問相同的數據庫,但現在我們都知道SQLite不像服務器數據庫引擎,它一次只能訪問一次。
我想知道是否有某種方法可以在數據庫被其他進程訪問時「鎖定」數據庫,以便如果第二個進程試圖同時訪問數據庫,它會一直等到第一個進程過程完成,然後嘗試再次訪問它。
如何處理這個問題?
我正在開發一個使用SQLite作爲主數據存儲方法的應用程序。我有兩個進程爲使用備用入口點的應用程序運行。從不同進程訪問SQLite
我需要從兩個不同的進程訪問相同的數據庫,但現在我們都知道SQLite不像服務器數據庫引擎,它一次只能訪問一次。
我想知道是否有某種方法可以在數據庫被其他進程訪問時「鎖定」數據庫,以便如果第二個進程試圖同時訪問數據庫,它會一直等到第一個進程過程完成,然後嘗試再次訪問它。
如何處理這個問題?
如果您尚未創建一個將您的數據庫訪問抽象出來並將其存儲在RuntimeStore中的類。無論您要與SQLite進行接口,使用您存儲的GUID(RuntimeStore.get(long))獲取對該類的引用,並通過同步類(通常是成員對象鎖,同步方法)來同步類。
不要只使用維基百科風格的單例模式,因爲它不是跨平臺的流程中的真正單身人士。
參見:
http://www.blackberry.com/developers/docs/5.0.0api/net/rim/device/api/system/RuntimeStore.html
樣品:
class SQLManager {
private static long GUID = 0xa178d3ce564cae69L; // hash of com.stackoverflow.SQLManager
private SQLManager() {
// ctor stuff here
}
public static SQLManager getInstance() {
RuntimeStore rs = RuntimeStore.getRuntimeStore();
SQLManager instance = rs.get(GUID);
if (instance == null) {
instance = new SQLManager();
rs.put(GUID, instance);
}
return instance;
}
}
你還在使用單 「模式」 本身,而是要存儲的對象實例在RuntimeStore上第一getInstance調用,然後使用您指定的GUID將其從RuntimeStore中拉出。
感謝Doug !,我剛剛在Wiki上看了一篇關於單身人士的文章,對我來說是一個新詞,但我認爲我現在不喜歡它。爲什麼這在黑莓手機上不起作用?此功能在Java ME中不可用嗎? 因爲我不熟悉它,所以我現在將閱讀有關RuntimeStore的內容。我會很感激,如果你有一些代碼示例,但我仍然會閱讀有關運行時間商店 非常感謝! – Arturo 2010-08-13 20:55:42
順便說一下,你使用了SQLITE_BUSY標誌@黑莓手機嗎?我不確定這是否可以成爲解決方案。這裏是一個例子 http://stackoverflow.com/questions/2775595/sqlite-multi-process-access – Arturo 2010-08-13 20:57:06
嘿道格,我讀了關於RuntimeStore,但它不是很清楚,在這種情況下,這是我應該包裝的objet在RuntimeStore。我創建了一個名爲SQLManager的類來處理所有的數據庫事件(打開,插入,更新,創建等),我應該包裝這個對象嗎?我認爲我不喜歡RuntimeStore的概念,但在這種情況下實現並不是很清晰。 = /,任何幫助將非常感激。在此先感謝 – Arturo 2010-08-13 21:01:29