SQLiteDatabase.EnableWriteAheadLogging Método

Definição

O registro em log com antecedência permite a execução paralela de consultas de vários threads no mesmo banco de dados e reduz a probabilidade de parar em sincronizações de sistema de arquivos.

[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

Retornos

True se o registro em log com antecedência estiver habilitado.

Atributos

Exceções

se houver transações em andamento no momento em que esse método for chamado. O modo WAL só pode ser alterado quando não há transações em andamento.

Comentários

O registro em log com antecedência permite a execução paralela de consultas de vários threads no mesmo banco de dados e reduz a probabilidade de parar em sincronizações de sistema de arquivos. O registro em log com antecedência é significativamente mais rápido na maioria dos cenários.

<Benefícios e práticas recomendadas< h3>/h3>

O log de gravação antecipada não está habilitado por padrão. No entanto, geralmente é recomendável que os aplicativos habilitem o registro em log com antecedência, a menos que o aplicativo use recursos SQLite que não sejam compatíveis com o registro em log com antecedência de gravação.

Quando o registro em log com antecedência é habilitado, as operações de gravação ocorrem em um arquivo de log separado, o que permite que as leituras em outros threads prossigam simultaneamente. Enquanto uma gravação está em andamento, os leitores em outros threads perceberão o estado do banco de dados como era antes do início da gravação. Quando a gravação for concluída, os leitores em outros threads perceberão o novo estado do banco de dados.

Outro benefício do registro em log com antecedência é que ele reduz o número de fsync chamadas para o sistema de arquivos subjacente. A chamada fsync pode bloquear os bloqueios do sistema e tem latência final ruim em dispositivos com sistemas de arquivos lentos.

A maneira mais eficiente de habilitar o registro em log com antecedência é passar o #ENABLE_WRITE_AHEAD_LOGGING sinalizador para #openDatabase. Isso é mais eficiente do que chamar #enableWriteAheadLogging. <pre> SQLiteDatabase db = SQLiteDatabase.openDatabase("db_filename", cursorFactory, SQLiteDatabase.CREATE_IF_NECESSARY | SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING, myDatabaseErrorHandler); </pre> <h3>Desabilitando o registro em log</h3>

Se o banco de dados tiver bancos de dados anexados, a execução de consultas em paralelo não será possível. Da mesma forma, não há suporte para registro em log com antecedência para bancos de dados somente leitura ou bancos de dados de memória. Nesses casos, #enableWriteAheadLogging() retorna false.

Quando o log de gravação antecipada não está habilitado (o padrão ou após a chamada #disableWriteAheadLogging), não é possível que leituras e gravações ocorram no banco de dados ao mesmo tempo. Antes de modificar o banco de dados, o gravador adquire implicitamente um bloqueio exclusivo no banco de dados que impede que os leitores acessem o banco de dados até que a gravação seja concluída.

O registro em log com antecedência aumenta ligeiramente o uso de memória pelo SQLite. Você pode medir o impacto na memória usando ferramentas como o meminfo.

<h3>Uso</h3>

Depois de abrir um banco de dados com o #ENABLE_WRITE_AHEAD_LOGGING sinalizador ou chamar esse método, a execução de consultas em paralelo é habilitada desde que o banco de dados permaneça aberto. Para desabilitar a execução de consultas em paralelo, chame #disableWriteAheadLogging ou feche o banco de dados e reabra-o.

A execução paralela de consultas é executada abrindo várias conexões com o banco de dados e usando uma conexão de banco de dados diferente para cada consulta. O modo de diário do banco de dados também é alterado para permitir que as gravações prossigam simultaneamente com leituras. O número máximo de conexões usadas para executar consultas em paralelo depende da memória do dispositivo e, possivelmente, de outras propriedades.

Se uma consulta fizer parte de uma transação, ela será executada no mesmo identificador de banco de dados em que a transação foi iniciada.

Os gravadores devem usar #beginTransactionNonExclusive() ou #beginTransactionWithListenerNonExclusive(SQLiteTransactionListener) iniciar uma transação. O modo não exclusivo permite que o arquivo de banco de dados fique legível por outros threads que executam consultas.

Se o banco de dados tiver bancos de dados anexados, a execução de consultas em paralelo não será possível. Da mesma forma, não há suporte para registro em log com antecedência para bancos de dados somente leitura ou bancos de dados de memória. Nesses casos, #enableWriteAheadLogging retorna false.

Consulte também o SQLite Write-Ahead Log para obter mais detalhes sobre como funciona o registro em log com antecedência de gravação.

Java documentação para android.database.sqlite.SQLiteDatabase.enableWriteAheadLogging().

Partes desta página são modificações baseadas no trabalho criado e compartilhado pelo Project Open Source do Open Source e usadas de acordo com os termos descritos na Creative Commons 2.5.

Aplica-se a

Confira também