言語

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

返品

先書きログが有効な場合は True。

属性

例外

このメソッドが呼び出された時点で進行中のトランザクションがある場合は >。 WAL モードは、進行中のトランザクションがない場合にのみ変更できます。

注釈

先行書き込みログを使用すると、同じデータベース上の複数のスレッドからクエリを並列実行でき、ファイルシステム同期でストールする可能性が低くなります。 ほとんどのシナリオでは、先行書き込みログの方が大幅に高速です。

<h3>Benefits とベスト プラクティス</h3>

先行書き込みログは、既定では有効になっていません。 ただし、アプリが先書きログと互換性のない SQLite 機能を使用しない限り、一般に、アプリで先書きログを有効にすることをお勧めします。

先行書き込みログが有効になっている場合、書き込み操作は別のログ ファイルで行われます。これにより、他のスレッドの読み取りを同時に続行できます。 書き込みの進行中、他のスレッドのリーダーは、書き込みが開始される前と同じようにデータベースの状態を認識します。 書き込みが完了すると、他のスレッドのリーダーはデータベースの新しい状態を認識します。

先行書き込みログのもう 1 つの利点は、基になるファイル システムへの 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() は false を返します。

先行書き込みログが有効になっていない場合 (既定では、または #disableWriteAheadLoggingを呼び出した後)、データベースで読み取りと書き込みを同時に実行することはできません。 データベースを変更する前に、ライターはデータベースの排他ロックを暗黙的に取得します。これにより、書き込みが完了するまでリーダーがデータベースにアクセスできなくなります。

先行書き込みログを使用すると、SQLite によるメモリ使用量がわずかに増加します。 meminfo などのツールを使用して、メモリへの影響を測定できます。

<h3>Usage</h3>

#ENABLE_WRITE_AHEAD_LOGGING フラグを指定してデータベースを開いた後、またはこのメソッドを呼び出すと、データベースが開いたままである限り、クエリの並列実行が有効になります。 クエリの並列実行を無効にするには、 #disableWriteAheadLogging を呼び出すか、データベースを閉じて再度開きます。

クエリの並列実行は、データベースへの複数の接続を開き、クエリごとに異なるデータベース接続を使用することによって実行されます。 データベース ジャーナル モードも変更され、書き込みで読み取りを同時に続行できるようになります。 クエリを並列で実行するために使用される接続の最大数は、デバイス のメモリと、場合によっては他のプロパティによって異なります。

クエリがトランザクションの一部である場合は、トランザクションが開始されたのと同じデータベース ハンドルで実行されます。

ライターは、トランザクションを開始するために #beginTransactionNonExclusive() または #beginTransactionWithListenerNonExclusive(SQLiteTransactionListener) を使用する必要があります。 非排他モードでは、クエリを実行している他のスレッドがデータベース ファイルを読み取り可能にすることができます。

データベースにアタッチされたデータベースがある場合、クエリを並列で実行することはできません。 同様に、先書きログは、読み取り専用データベースまたはメモリ データベースではサポートされていません。 このような場合、 #enableWriteAheadLogging は false を返します。

先行書き込みログの動作の詳細については、 SQLite Write-Ahead ログ記録も参照してください。

Javaドキュメント。

このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。

適用対象

こちらもご覧ください