SQLiteDatabase.EnableWriteAheadLogging Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Die Schreib-Ahead-Protokollierung ermöglicht die parallele Ausführung von Abfragen aus mehreren Threads in derselben Datenbank und reduziert die Wahrscheinlichkeit, dass die Dateisystemsynchronisierung angehalten wird.
[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
Gibt zurück
True, wenn die Protokollierung mit Schreibschutz aktiviert ist.
- Attribute
Ausnahmen
wenn zum Zeitpunkt des Aufrufs dieser Methode Transaktionen ausgeführt werden. Der WAL-Modus kann nur geändert werden, wenn keine Transaktionen ausgeführt werden.
Hinweise
Die Schreib-Ahead-Protokollierung ermöglicht die parallele Ausführung von Abfragen aus mehreren Threads in derselben Datenbank und reduziert die Wahrscheinlichkeit, dass die Dateisystemsynchronisierung angehalten wird. Die Protokollierung mit Schreibschutz ist in den meisten Szenarien wesentlich schneller.
<h3>Vorteile und bewährte Methoden</h3>
Die Protokollierung für den Vorausschreibvorgang ist standardmäßig nicht aktiviert. Es wird jedoch in der Regel empfohlen, dass Apps die Protokollierung im Voraus schreiben, es sei denn, die App verwendet SQLite-Features, die nicht mit der Protokollierung mit Schreibschutz kompatibel sind.
Wenn die Schreib-Ahead-Protokollierung aktiviert ist, treten Schreibvorgänge in einer separaten Protokolldatei auf, wodurch Lesevorgänge in anderen Threads gleichzeitig fortgesetzt werden können. Während ein Schreibvorgang ausgeführt wird, nehmen Leser in anderen Threads den Zustand der Datenbank so wahr, wie sie vor beginn des Schreibvorgangs war. Nach Abschluss des Schreibvorgangs nehmen Leser in anderen Threads den neuen Zustand der Datenbank wahr.
Ein weiterer Vorteil der Schreib-Ahead-Protokollierung besteht darin, dass die Anzahl der fsync Aufrufe an das zugrunde liegende Dateisystem reduziert wird. Aufrufe fsync blockieren möglicherweise Systemsperren und verfügen über eine schlechte Taillatenz auf Geräten mit langsamen Dateisystemen.
Die effizienteste Möglichkeit zum Aktivieren der Schreibschutzprotokollierung besteht darin, die #ENABLE_WRITE_AHEAD_LOGGING Kennzeichnung an .#openDatabase Dies ist effizienter als das Aufrufen #enableWriteAheadLogging.
<pre> SQLiteDatabase db = SQLiteDatabase.openDatabase("db_filename", cursorFactory, SQLiteDatabase.CREATE_IF_NECESSARY | SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING, myDatabaseErrorHandler); </pre>
<h3>Deaktivierung der Protokollierung< im Voraus/h3>
Wenn die Datenbank über angefügte Datenbanken verfügt, ist die Parallelausführung von Abfragen nicht möglich. Ebenso wird die Schreibschutzprotokollierung für schreibgeschützte Datenbanken oder Speicherdatenbanken nicht unterstützt. Gibt in solchen Fällen #enableWriteAheadLogging() "false" zurück.
Wenn die Schreib-Ahead-Protokollierung nicht aktiviert ist (standard oder nach dem Aufruf #disableWriteAheadLogging), ist es nicht möglich, dass Lese- und Schreibvorgänge gleichzeitig in der Datenbank auftreten. Bevor Sie die Datenbank ändern, erhält der Writer implizit eine exklusive Sperre für die Datenbank, die verhindert, dass Leser auf die Datenbank zugreifen, bis der Schreibvorgang abgeschlossen ist.
Die Schreib-Ahead-Protokollierung erhöht die Speicherauslastung durch SQLite leicht. Sie können die Auswirkungen auf den Arbeitsspeicher mithilfe von Tools wie Meminfo messen.
<h3>Verwendung</h3>
Nach dem Öffnen einer Datenbank mit dem #ENABLE_WRITE_AHEAD_LOGGING Flag oder durch Aufrufen dieser Methode ist die Parallelausführung von Abfragen aktiviert, solange die Datenbank geöffnet bleibt. Um die Ausführung von Abfragen parallel zu deaktivieren, rufen Sie entweder die Datenbank auf #disableWriteAheadLogging , oder schließen Sie sie, und öffnen Sie sie erneut.
Parallele Ausführung von Abfragen erfolgt durch Öffnen mehrerer Verbindungen mit der Datenbank und Verwenden einer anderen Datenbankverbindung für jede Abfrage. Der Datenbankjournalmodus wird auch geändert, damit Schreibvorgänge gleichzeitig mit Lesevorgängen fortgesetzt werden können. Die maximale Anzahl von Verbindungen, die zum Ausführen von Abfragen parallel verwendet werden, hängt vom Gerätespeicher und möglicherweise anderen Eigenschaften ab.
Wenn eine Abfrage Teil einer Transaktion ist, wird sie auf demselben Datenbankhandle ausgeführt, mit dem die Transaktion begonnen wurde.
Autoren sollten eine Transaktion verwenden #beginTransactionNonExclusive() oder #beginTransactionWithListenerNonExclusive(SQLiteTransactionListener) starten. Im nicht exklusiven Modus können Datenbankdateien von anderen Threads gelesen werden, die Abfragen ausführen.
Wenn die Datenbank über angefügte Datenbanken verfügt, ist die Parallelausführung von Abfragen nicht möglich. Ebenso wird die Schreibschutzprotokollierung für schreibgeschützte Datenbanken oder Speicherdatenbanken nicht unterstützt. Gibt in solchen Fällen #enableWriteAheadLogging "false" zurück.
Weitere Informationen zur Funktionsweise der Schreibschutzprotokollierung finden Sie auch unter SQLite Write-Ahead Logging.
Java Dokumentation für android.database.sqlite.SQLiteDatabase.enableWriteAheadLogging().
Teile dieser Seite sind Änderungen auf der Grundlage von Arbeiten, die von der Android Open Source Project erstellt und gemeinsam verwendet und gemäß den in der 2.5 Attribution License beschriebenen Begriffen verwendet werden.