SQLiteDatabase.EnableWriteAheadLogging 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
預先寫入記錄可同時執行同一資料庫中多個執行緒的查詢,並降低檔案系統同步時停滯的可能性。
[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 所創建與分享的作品,並依授權條款所描述的使用進行修改。