語言

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 模式才能更改。

備註

預先寫入記錄可同時執行同一資料庫中多個執行緒的查詢,並降低檔案系統同步時停滯的可能性。 在大多數情況下,預先寫入日誌的速度明顯快得多。

<h3>優點與最佳實務</h3>

預設情況下並未啟用預先寫入日誌。 不過一般建議應用程式啟用預先寫入日誌,除非該應用程式使用與預先寫入不相容的功能。

啟用先寫日誌時,寫入操作會在獨立的日誌檔進行,允許其他執行緒的讀取同時進行。 當寫入進行中,其他執行緒的讀者會感知到寫入開始前資料庫的狀態。 當寫入完成後,其他執行緒的讀者將感知資料庫的新狀態。

預先寫入日誌的另一個好處是能減少對底層檔案系統的呼叫次數 fsync 。 呼叫 fsync 可能會被系統鎖定阻擋,且在檔案系統較慢的裝置上,尾端延遲較差。

啟用預先寫入記錄最有效率的方式是將旗標傳遞 #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> <h3>停用提前寫入記錄/<h3>

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

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

預先寫入日誌會稍微增加 SQLite 的記憶體使用量。 你可以用像 meminfo 這類工具來衡量對記憶的影響。

<h3>用法</h3>

在使用 #ENABLE_WRITE_AHEAD_LOGGING 該標誌開啟資料庫或呼叫此方法後,只要資料庫保持開啟,查詢的平行執行即被啟用。 若要停用平行執行查詢,請呼叫 #disableWriteAheadLogging 或關閉資料庫並重新開啟。

查詢的平行執行是透過開啟多個資料庫連線,並為每個查詢使用不同的資料庫連線來完成。 資料庫日誌模式也被修改,使寫入能與讀取同時進行。 平行執行查詢的最大連線數取決於裝置記憶體及可能的其他特性。

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

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

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

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

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

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

適用於

另請參閱