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 模式才能更改。
備註
此方法允許在同一資料庫中平行執行來自多個執行緒的查詢。 它透過開啟多個資料庫連線,並為每個查詢使用不同的資料庫連線來達成此目標。 資料庫日誌模式也被修改,使寫入能與讀取同時進行。
當預設未啟用寫入日誌時,資料庫無法同時進行讀取與寫入。 在修改資料庫前,寫入者會隱含取得資料庫的專屬鎖,阻止讀取器在寫入完成前存取資料庫。
相較之下,當啟用前寫日誌(透過呼叫此方法)時,寫入操作會在另一個日誌檔中進行,允許讀取同時進行。 當寫入進行中,其他執行緒的讀者會感知到寫入開始前資料庫的狀態。 當寫入完成後,其他執行緒的讀者將感知資料庫的新狀態。
當資料庫同時被多個執行緒存取與修改時,啟用預先寫入日誌是個好主意。 然而,預先寫入日誌使用比一般日誌更多的記憶體,因為同一資料庫有多個連線。 因此,如果資料庫只被單一執行緒使用,或優化並行性並非非常重要,那麼就應該停用預先寫入日誌。
呼叫此方法後,只要資料庫保持開啟,即可平行執行查詢。 若要停用平行執行查詢,請呼叫 #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 所創建與分享的作品,並依授權條款所描述的使用進行修改。