2014-02-20 47 views
0

我想了解多線程訪問ATTACHED sqlite數據庫所涉及的問題。顯而易見的是,一個SQLiteOpenHelper可確保一個數據庫連接,從而確保對數據庫的一個序列化訪問。當一個「子」數據庫連接兩次,在兩個不同的「父」SQLiteOpenHelper s /兩個不同的父數據庫連接下時會發生什麼?Android中的附加sqlite數據庫和多線程問題

Q1:如何訪問連接的子數據庫序列化?問題2:在這種情況下如何提前寫入日誌記錄?

需要明確的是,這是我所描述的情景:

ASQLiteOpenHelper instanceA = new ASQLiteOpenHelper(context, dbnameA, null, version); 
BSQLiteOpenHelper instanceB = new BSQLiteOpenHelper(context, dbnameB, null, version); 

instanceA.getWritableDatabase().execSQL("ATTACH '" + dbnameChild + "' AS child"); 
instanceB.getWritableDatabase().execSQL("ATTACH '" + dbnameChild + "' AS child"); 

通過instanceAinstanceB同時安全寫入「孩子」?閱讀怎麼樣?如果爲家長啓用writeahead日誌記錄,是否也爲孩子啓用?如果是,是爲child創建的兩個單獨的預寫日誌記錄嗎?

+0

看起來'DB'是一個共享資源,'SQLiteOpenHelpers'的多個實例正在訪問'DB'。請糾正我,如果我錯誤解釋你的情況。 – guptakvgaurav

+0

我認爲你錯誤地解釋了我的情況。有三個獨立的數據庫:dbnameA,dbnameB和dbnameChild。這兩個助手每個都打開一個不同的數據庫。但是,第三個數據庫dbnameChild連接到兩個助手下。 – zyamys

+0

因此,dbnameChild是兩個助手的共享資源。是不是 – guptakvgaurav

回答

0

經過一番測試,我發現ATTACH ed數據庫將被鎖定在第一個ATTACH嘗試。進一步ATTACH嘗試將失敗。

0

here

我們都知道,作爲支持多 作爲併發的SQLite沒有其他嵌入式SQL數據庫引擎的。 SQLite允許多個進程一次打開數據庫文件,並允許多個進程一次讀取數據庫 。當任何進程想要寫入時,它必須在整個數據庫文件更新期間鎖定整個數據庫文件。但通常 只需要幾毫秒。其他進程只需等待作者 完成,然後繼續他們的業務。其他嵌入式SQL數據庫引擎通常只允許單個進程一次連接到數據庫。

here是關於併發性的大量信息。

+0

謝謝,但這並沒有解決我的問題,因爲Android中鎖定的數據庫將導致運行時異常。這就是SQLiteOpenHelper用作單例的原因 - 確保只有一個數據庫連接用於讀/寫。我的問題是關於在多線程場景中附加數據庫的結果。 – zyamys

+0

@zyamys我應該讀得更好..這是深夜在這裏! :( – Merlevede