アプリ用の互換性 write-ahead log 書き込み

Android 9 では、SQLiteDatabase の特別なモードである互換性 WAL(write-ahead log 書き込み)が導入されています。これにより、データベースあたり最大 1 つの接続を維持しながら、データベースで journal_mode=WAL を使用できます。

互換性 WAL は、アプリが次のいずれかの条件に該当しない限り、デフォルトでアプリのデータベースに対して有効になります。

  1. SQLiteDatabase.enableWriteAheadLogging または disableWriteAheadLogging を呼び出して、write-ahead log 書き込みを有効または無効にした
  2. SQLiteDatabase.OpenParams.setJournalMode(String mode) を呼び出して、ジャーナル モードを明示的にリクエストした

WAL ジャーナル モードを有効にすると、パフォーマンスが大幅に改善されて書き込み量が減少します。たとえば、ext4 ファイル システムでは、WAL によって書き込み速度が 4 倍に向上します。

互換性 WAL はデフォルトで有効になっており、追加の実装は不要です。

互換性 WAL を無効にする

互換性 WAL モードを無効にするには、db_compatibility_wal_supported 構成リソースをオーバーレイします。

例:

<bool name="db_compatibility_wal_supported">false</bool>

WAL ジャーナル モードを使用しても従来のロールバック ジャーナル モードよりパフォーマンスが向上しない構成では、互換性 WAL を無効にすることをおすすめします。たとえば、F2FS ファイル システムでは、SQLite でアトミック書き込みがサポートされており、DELETE ジャーナルのパフォーマンスは WAL と同程度ですが、WAL によって書き込み量が 10%~15% 増加する可能性があります。

検証

互換性 WAL モードを検証するには、CtsDatabaseTestCases モジュールの CTS テストを実施します。互換性 WAL が有効になっている場合、想定される動作が CTS テストにより検証されます。