Android 9 では、SQLiteDatabase の特別なモードである互換性 WAL(write-ahead log 書き込み)が導入されています。これにより、データベースあたり最大 1 つの接続を維持しながら、データベースで journal_mode=WAL
を使用できます。
互換性 WAL は、アプリが次のいずれかの条件に該当しない限り、デフォルトでアプリのデータベースに対して有効になります。
SQLiteDatabase.enableWriteAheadLogging
またはdisableWriteAheadLogging
を呼び出して、write-ahead log 書き込みを有効または無効にした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 テストにより検証されます。