Wenn ich SQLite verwende, habe ich normalerweise eine einzige SQLiteOpenHelper-Instanz pro Anwendung und schließe sie nie, da ihre Datenbank ständig von vielen anderen Klassen benutzt wird und das Schließen / Wiedereröffnen langsamer und komplizierter wäre.
Jetzt spiele ich mit Realm und ich möchte nur von Datenzugriffsobjekten auf Realm-Instanzen zugreifen. Jeder Aufruf wird von einem Worker-Thread ausgeführt.
Ich habe die Beispiele gelesen und sie rufen in der Regel getInstance / close pro Aktivität oder Hintergrundaufgabe auf. Da Realm die Daten in einer Datei wie SQLite fortsetzt, ist es eine gute Idee, getInstance / close für jede Operation aufzurufen? Ich meine, würde close
tatsächlich die Dateiverbindung schließen und damit den nächsten getInstance
-Aufruf langsamer machen? Soll ich eine Realm-Instanz auf Anwendungsebene zwischenspeichern und stattdessen in die DAOs injizieren?
Realm verwendet einen lokalen Referenz-Thread-Thread und eine optimierte Schema-Validierung. Das bedeutet, dass solange Sie mindestens eine Instanz in einem Thread geöffnet haben, der Realm.getInstance()
aufruft, nur eine HashMap-Suche.
Wenn Sie eine Instanz in any -Thread geöffnet haben, überspringen wir die Schema-Validierung für andere Threads, obwohl sie dort als erste Instanz geöffnet ist.
Wenn Sie alle Instanzen eines bestimmten Threads schließen, wird der lokale Thread-Speicher freigegeben und muss für die nächste Instanz dieses Threads erneut zugewiesen werden.
Wenn Sie alle Instanzen in allen Threads schließen, haben Sie einen "Kaltstart", der am teuersten ist, da wir Speicher reservieren müssen + eine Schema-Validierung durchführen müssen.
Bewährte Methode ist, die Realm-Instanz so lange offen zu lassen, wie dein Thread lebt. Für den UI-Thread, der am einfachsten mit dem hier beschriebenen Muster ausgeführt wird: Ссылка
Für Worker-Threads, die die Realm-Instanz zu Beginn öffnen und beim Beenden schließen, wäre das Optimalste:
%Vor%Tags und Links java android persistence realm