SQLiteDatabase.EnableWriteAheadLogging Método

Definición

El registro de escritura anticipada permite la ejecución en paralelo de consultas de varios subprocesos en la misma base de datos y reduce la probabilidad de detenerse en las sincronizaciones del sistema de archivos.

[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

Devoluciones

True si el registro de escritura anticipada está habilitado.

Atributos

Excepciones

si hay transacciones en curso en el momento en que se llama a este método. El modo WAL solo se puede cambiar cuando no hay transacciones en curso.

Comentarios

El registro de escritura anticipada permite la ejecución en paralelo de consultas de varios subprocesos en la misma base de datos y reduce la probabilidad de detenerse en las sincronizaciones del sistema de archivos. El registro de escritura anticipada es significativamente más rápido en la mayoría de los escenarios.

<h3>Ventajas y procedimientos recomendados</h3>

El registro de escritura anticipada no está habilitado de forma predeterminada. Sin embargo, se recomienda generalmente que las aplicaciones habiliten el registro de escritura anticipada, a menos que la aplicación use características de SQLite que no sean compatibles con el registro de escritura previa.

Cuando se habilita el registro de escritura anticipada, las operaciones de escritura se producen en un archivo de registro independiente, lo que permite que las lecturas de otros subprocesos continúen simultáneamente. Mientras una escritura está en curso, los lectores de otros subprocesos percibirán el estado de la base de datos tal como estaba antes de que comenzara la escritura. Cuando se complete la escritura, los lectores de otros subprocesos percibirán el nuevo estado de la base de datos.

Otra ventaja del registro de escritura anticipada es que reduce el número de llamadas al sistema de fsync archivos subyacente. La llamada fsync puede bloquearse en los bloqueos del sistema y tiene una latencia de cola deficiente en los dispositivos con sistemas de archivos lentos.

La manera más eficaz de habilitar el registro de escritura anticipada es pasar la #ENABLE_WRITE_AHEAD_LOGGING marca a #openDatabase. Esto es más eficaz que llamar a #enableWriteAheadLogging. <pre> SQLiteDatabase db = SQLiteDatabase.openDatabase("db_filename", cursorFactory, SQLiteDatabase.CREATE_IF_NECESSARY | SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING, myDatabaseErrorHandler); </pre> <h3>Deshabilitar el registro< de escritura anticipada/h3>

Si la base de datos tiene bases de datos adjuntas, la ejecución de consultas en paralelo NO es posible. Del mismo modo, no se admite el registro de escritura anticipada para bases de datos de solo lectura o bases de datos de memoria. En tales casos, #enableWriteAheadLogging() devuelve false.

Cuando el registro de escritura anticipada no está habilitado (el valor predeterminado o después de llamar a #disableWriteAheadLogging), no es posible que las lecturas y escrituras se produzcan en la base de datos al mismo tiempo. Antes de modificar la base de datos, el escritor adquiere implícitamente un bloqueo exclusivo en la base de datos que impide que los lectores accedan a la base de datos hasta que se complete la escritura.

El registro de escritura anticipada aumenta ligeramente el uso de memoria por SQLite. Puede medir el impacto en la memoria mediante herramientas como meminfo.

<h3>Usage</h3>

Después de abrir una base de datos con la #ENABLE_WRITE_AHEAD_LOGGING marca o llamando a este método, la ejecución de consultas en paralelo se habilita siempre que la base de datos permanezca abierta. Para deshabilitar la ejecución de consultas en paralelo, llame #disableWriteAheadLogging a o cierre la base de datos y vuelva a abrirla.

La ejecución paralela de consultas se realiza abriendo varias conexiones a la base de datos y usando una conexión de base de datos diferente para cada consulta. El modo de diario de base de datos también se cambia para permitir que las escrituras continúen simultáneamente con las lecturas. El número máximo de conexiones usadas para ejecutar consultas en paralelo depende de la memoria del dispositivo y posiblemente de otras propiedades.

Si una consulta forma parte de una transacción, se ejecuta en el mismo identificador de base de datos que se inició la transacción.

Los escritores deben usar #beginTransactionNonExclusive() o #beginTransactionWithListenerNonExclusive(SQLiteTransactionListener) para iniciar una transacción. El modo no exclusivo permite que otros subprocesos que ejecuten consultas puedan leer el archivo de base de datos.

Si la base de datos tiene bases de datos adjuntas, la ejecución de consultas en paralelo NO es posible. Del mismo modo, no se admite el registro de escritura anticipada para bases de datos de solo lectura o bases de datos de memoria. En tales casos, #enableWriteAheadLogging devuelve false.

Consulte también SQLite Write-Ahead registro para obtener más información sobre cómo funciona el registro de escritura anticipada.

Java documentación para android.database.sqlite.SQLiteDatabase.enableWriteAheadLogging().

Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el Android y se usan según los términos descritos en creative Creative Commons 2.5 Attribution License.

Se aplica a

Consulte también