android - Ist Sqlite-Datenbank-Instanz Thread sicher




locking thread-safety (3)

Das Android verwendet einen Java-Sperrmechanismus, um den SQLite-Datenbankzugriff serialisiert zu halten. Wenn also mehrere Threads eine db-Instanz haben, ruft sie immer serialisiert die Datenbank an, und natürlich ist die Datenbank Thread-sicher .

Wenn wir bestätigen, dass wir eine Datenbank aus einem einzelnen Thread verwenden, hatten wir die Möglichkeit, die interne Sperre der Datenbank durch Aufruf von setLockingEnable(false) aber diese Methode wurde ab API-Stufe 16 nicht mehr verwendet und nicht mehr verwendet. Wenn Sie die Implementierung dieser Methode in der SQLiteDatabase Klasse sehen, finden Sie dort nichts geschrieben, dh eine leere Methode.

public void setLockingEnabled (boolean lockingEnabled)

Diese Methode macht jetzt nichts. Verwende nicht.

Eine Sache, um die wir uns kümmern sollten, ist, dass wir eine Instanz Ihrer Hilfsklasse machen (dh indem wir Singleton machen) und dieselbe Instanz mit mehreren Threads teilen und nicht clos close() in der Datenbank zwischen den Operationen aufrufen, sonst bekommen Sie vielleicht folgende Ausnahme:

java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase

Also, rufen Sie nicht database.close() zwischen den Zugriff auf die Datenbank, Datenbank selbst führen schließen Operation intern, wenn alle Operation beendet wäre.

https://code.i-harness.com

Ich habe eine Datenbank mit einigen Tabellen. Ich möchte die Tabellen mit mehreren Threads aktualisieren. Ich werde dieselbe Instanz von SQLiteDatabase in allen Threads verwenden.

Bitte schlagen Sie vor, ob dieser Ansatz korrekt ist. Ist Sqlite-Datenbank threadsafe? Können zwei verschiedene Threads die gleiche Tabelle für verschiedene Werte gleichzeitig aktualisieren.


Sie können steuern, ob developer.android.com/reference/android/database/sqlite/… Datenbank threadsicher ist oder nicht, indem Sie developer.android.com/reference/android/database/sqlite/… .

Steuern Sie, ob die SQLiteDatabase threadsicher ist, indem Sie Sperren um kritische Abschnitte verwenden. Das ist ziemlich teuer. Wenn Sie also wissen, dass Ihre Datenbank nur von einem einzelnen Thread verwendet wird, sollten Sie dies auf false setzen. Der Standardwert ist wahr

Also ich denke das beantwortet deine Frage.

Die Methode setLockingEnabled wird in API-Ebene 16 abgeschrieben


[WRONG:] Nein, es ist standardmäßig nicht Thread-sicher. Sie sollten Sperren-bezogene SQLiteHelper-Methoden verwenden, um Thread-Sicherheit bereitzustellen.

[EDIT]: SQLiteDatabase-Klasse bietet standardmäßig einen Sperrmechanismus (siehe Kommentare) und wenn Sie auf Multithread laufen, müssen Sie nichts ändern, um Thread-Sicherheit zu haben.

Suchen Sie nach 'thread' in diesem Dokument: http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

Und lesen Sie mehr unter:





thread-safety