Android 9 introduce 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, conserve el comportamiento de mantener un máximo de una conexión por base de datos.
El WAL de compatibilidad está habilitado de forma predeterminada para la base de datos de una app, a menos que esta cumpla con uno de los siguientes requisitos:
- Se habilitó o inhabilitó 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 escrituras. Por ejemplo, en un sistema de archivos ext4, el WAL puede mejorar la velocidad de escritura en 4 veces.
El WAL de compatibilidad está habilitado de forma predeterminada y no requiere ninguna implementación adicional.
Inhabilita el WAL de compatibilidad
Para inhabilitar el modo WAL de compatibilidad, superpón 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 registro DELETE es similar al de WAL, WAL puede aumentar la cantidad de escrituras entre un 10% y un 15%.
Validación
Para validar el modo WAL de compatibilidad, ejecuta pruebas de CTS desde el módulo CtsDatabaseTestCases. Las pruebas del CTS verificarán el comportamiento esperado cuando el WAL de compatibilidad esté habilitado.