SQLiteDatabase.EnableWriteAheadLogging 方法

定義

此方法允許在同一資料庫中平行執行來自多個執行緒的查詢。

[Android.Runtime.Register("enableWriteAheadLogging", "()Z", "GetEnableWriteAheadLoggingHandler")]
public virtual bool EnableWriteAheadLogging();
[<Android.Runtime.Register("enableWriteAheadLogging", "()Z", "GetEnableWriteAheadLoggingHandler")>]
abstract member EnableWriteAheadLogging : unit -> bool
override this.EnableWriteAheadLogging : unit -> bool

傳回

若啟用了預先寫入記錄,則為真。

屬性

例外狀況

如果當時有交易進行中,則呼叫此方法。 只有在沒有交易進行時,WAL 模式才能更改。

備註

此方法允許在同一資料庫中平行執行來自多個執行緒的查詢。 它透過開啟多個資料庫連線,並為每個查詢使用不同的資料庫連線來達成此目標。 資料庫日誌模式也被修改,使寫入能與讀取同時進行。

當預設未啟用寫入日誌時,資料庫無法同時進行讀取與寫入。 在修改資料庫前,寫入者會隱含取得資料庫的專屬鎖,阻止讀取器在寫入完成前存取資料庫。

相較之下,當啟用前寫日誌(透過呼叫此方法)時,寫入操作會在另一個日誌檔中進行,允許讀取同時進行。 當寫入進行中,其他執行緒的讀者會感知到寫入開始前資料庫的狀態。 當寫入完成後,其他執行緒的讀者將感知資料庫的新狀態。

當資料庫同時被多個執行緒存取與修改時,啟用預先寫入日誌是個好主意。 然而,預先寫入日誌使用比一般日誌更多的記憶體,因為同一資料庫有多個連線。 因此,如果資料庫只被單一執行緒使用,或優化並行性並非非常重要,那麼就應該停用預先寫入日誌。

呼叫此方法後,只要資料庫保持開啟,即可平行執行查詢。 若要停用平行執行查詢,請呼叫 #disableWriteAheadLogging 或關閉資料庫並重新開啟。

平行執行查詢的最大連線數取決於裝置記憶體及可能的其他特性。

如果查詢是交易的一部分,則會在交易開始的同一資料庫 handle 上執行。

寫手應該使用 #beginTransactionNonExclusive()#beginTransactionWithListenerNonExclusive(SQLiteTransactionListener) 啟動交易。 非獨佔模式允許資料庫檔案在執行查詢時被其他執行緒讀取。

如果資料庫有任何附加資料庫,則無法平行執行查詢。 同樣地,只讀資料庫或記憶體資料庫不支援預先寫入日誌。 在這種情況下,回 #enableWriteAheadLogging 傳為假。

啟用預先寫入記錄的最佳方法是將旗標傳遞 #ENABLE_WRITE_AHEAD_LOGGING#openDatabase。 這比呼叫 #enableWriteAheadLogging更高效。 <pre> SQLiteDatabase db = SQLiteDatabase.openDatabase("db_filename", cursorFactory, SQLiteDatabase.CREATE_IF_NECESSARY | SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING, myDatabaseErrorHandler); </pre>

另一種啟用寫入日誌的方法是開啟資料庫後再呼叫 #enableWriteAheadLogging<pre> SQLiteDatabase db = SQLiteDatabase.openDatabase("db_filename", cursorFactory, SQLiteDatabase.CREATE_IF_NECESSARY, myDatabaseErrorHandler); db.enableWriteAheadLogging(); </pre>

另請參閱 SQLite Write-Ahead Logging ,了解更多關於預先寫入日誌的運作方式。

Java 文件 android.database.sqlite.SQLiteDatabase.enableWriteAheadLogging()

本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。

適用於

另請參閱