Android 9 presenta un modo especial de SQLiteDatabase llamado registro de escritura anticipada (WAL) de compatibilidad que permite que una base de datos use journal_mode=WAL
y, al mismo tiempo, conserva el comportamiento de mantener un máximo de una conexión por base de datos.
El WAL de compatibilidad está habilitado para la base de datos de una app de forma predeterminada, a menos que la app tenga lo siguiente:
- Aceptaste o rechazaste el registro de escritura por adelantado llamando a
SQLiteDatabase.enableWriteAheadLogging
odisableWriteAheadLogging
. - Se solicitó explícitamente el modo de registro llamando a
SQLiteDatabase.OpenParams.setJournalMode(String mode)
.
Habilitar el modo de registro WAL puede generar una mejora significativa en el rendimiento y una reducción en la cantidad de operaciones de escritura. Por ejemplo, en un sistema de archivos ext4, el WAL puede producir una mejora 4 veces mayor en la velocidad de escritura.
El WAL de compatibilidad está habilitado de forma predeterminada y no requiere ninguna implementación adicional.
Inhabilita WAL de compatibilidad
Para inhabilitar el modo de WAL de compatibilidad, superpone el recurso de configuración db_compatibility_wal_supported
.
Por ejemplo:
<bool name="db_compatibility_wal_supported">false</bool>
Es posible que desees inhabilitar el WAL de compatibilidad para las configuraciones en las que el modo de registro de WAL no proporciona una ventaja de rendimiento sobre los modos de registro de reversión tradicionales. Por ejemplo, en un sistema de archivos F2FS, aunque SQLite admite escrituras atómicas y el rendimiento del diario DELETE es similar al WAL, WAL puede aumentar la cantidad de escrituras entre un 10% y un 15%.
Validación
Para validar el modo de WAL de compatibilidad, ejecuta pruebas de CTS desde el módulo CtsDatabaseTestCases. Las pruebas de CTS verificarán el comportamiento esperado cuando se habilite la WAL de compatibilidad.