Ich entwickle ein kleines System mit zwei Komponenten: Eine Komponente fragt Daten von einer Internetressource ab und übersetzt sie in SQL-Daten, um sie lokal beizubehalten. Die zweite liest die SQL-Daten aus der lokalen Instanz und stellt sie über JSON und eine API zur Verfügung.
Ursprünglich plante ich, die Daten mit postgresql beizubehalten. Da die Anwendung jedoch nur ein sehr geringes Datenvolumen zum Speichern und Bereitstellen des Datenverkehrs hat, hielt ich das für übertrieben. Ist SQLite der Aufgabe gewachsen? Ich mag die Idee des geringen Platzbedarfs und die Tatsache, dass für diese eine Aufgabe kein weiterer SQL-Server gewartet werden muss, sehr, aber ich mache mir Sorgen um die Parallelität.
Es scheint, dass bei aktivierter Vorausschreibeprotokollierung das gleichzeitige Lesen und Schreiben einer SQLite-Datenbank erfolgen kann, ohne dass ein Prozess aus der Datenbank gesperrt wird.
Kann eine einzelne SQLite-Instanz zwei gleichzeitig auf sie zugreifende Prozesse unterstützen, wenn nur einer liest und der andere schreibt? Ich habe angefangen, den Code zu schreiben, habe mich aber gefragt, ob dies eine fehlerhafte Anwendung von SQLite ist.
Antworten:
Sie suchen nach der Dokumentation zu File Locking And Concurrency .
SQLite-Prozesse verwenden eine Reihe von Sperren, um die Parallelität zu behandeln. Zum Lesen können mehrere Prozesse eine
SHARED
Sperre erhalten.Ein schreibender Prozess muss eine
RESERVED
Sperre erhalten, und nur wenn tatsächlich Änderungen auf die Festplatte geschrieben werden müssen, wechselt er in denPENDING
Status. Jeder Lesevorgang muss dann die Datei entsperren, woraufhin der SchreibvorgangEXCLUSIVE
zum Schreiben in die eigentliche Datenbankdatei verschoben werden kann.Da der Writer-Prozess nur die Datenbankdatei für tatsächliche Schreibvorgänge (Speicherlöschvorgänge, Festschreibungen) sperren muss, ist eine Einrichtung mit nur einem Reader und nur einem Writer recht gut. Ich würde erwarten, dass es genauso gut, wenn nicht sogar besser ist, als ein Setup mit nur einem Prozess, der das Lesen und Schreiben übernimmt.
SQLite ist weniger geeignet, wenn mehrere Prozesse häufig in dieselbe Datenbank schreiben, da für das Schreiben die exklusive
PENDING
Sperre zum Serialisieren von Änderungen benötigt wird.quelle
Ich wollte nur nachfassen und allen mitteilen, dass die Implementierung erfolgreich war. Die Arbeit mit SQLite war ein echtes Vergnügen, und mit nur einem Prozess, der es gleichzeitig schrieb, hatten wir nie Probleme mit der Sperrung ... selbst bei sehr schnellen gleichzeitigen Lesevorgängen von einem sekundären Prozess.
quelle