Schreiben in SQLite Datenbank von mehreren Threads aus
Verfasst: Dienstag 1. November 2022, 21:47
Hallo zusammen,
ich stehe aktuell vor einem Problem mit dem ich mich schon öfter beschäftigt habe. Ich habe eine Anwendung die in mehreren Threads läuft und eine SQLite Datenbank. da ich für die Datenbank check_same_thread=False gesetzt habe ist das lesen und schreiben von mehren Threads aus möglich. In meinen Tests machte das bisher auch keine Probleme, aber ich habe gelernt das es selten eine gute Idee ist von mehreren Threads aus in die selbe Datei zu schreiben. Ich vermute das SQLite da auch nicht selbst intern dafür sorgt das paralleles schreiben möglich ist. Andere Datenbanken wären vermutlich besser geeignet, aber ich möchte das kleine Projekt nicht durch einen MySQL Server oder ähnliches unnötig komplex machen.
Mit fallen zwei Ansätze an, aber ich bin mir bei beiden nicht sicher ob diese so optimal sind.
1) Eine Queue benutzen
Laut Dokumenation ist die Queue Thread sicher und das parallele reinschreiben kein Problem. Ich würde also aus den verschiedenen Threads erst in die Queue schreiben und dann aus einem Thread heraus die Daten aus der Queue in die Datenbank schreiben. So würde immer nur der eine Thread in die Datenbank schreiben. Diese Variante habe ich schon mal ausprobiert und hat in meinen Tests funktioniert.
2) Mutex benutzen
Ich könnte bevor ich in die Datenbank schreibe einen lock setzen. Da es in meinem Anwendungsfall selten vorkommt das tatsächlich mehrere Threads in die Datenbank schreiben sollte es eigentlich kein Problem sein wenn da mal ein Thread ein paar Millisekunden warten. Da ich nur eine Funktion habe die in die Datenbank schreib wäre die Variante auch schneller umzusetzten als Variante 1.
Was meint ihr, taugen die beiden Varianten in der Praxis und habt ihr vielleicht noch andere Herangehensweisen?
ich stehe aktuell vor einem Problem mit dem ich mich schon öfter beschäftigt habe. Ich habe eine Anwendung die in mehreren Threads läuft und eine SQLite Datenbank. da ich für die Datenbank check_same_thread=False gesetzt habe ist das lesen und schreiben von mehren Threads aus möglich. In meinen Tests machte das bisher auch keine Probleme, aber ich habe gelernt das es selten eine gute Idee ist von mehreren Threads aus in die selbe Datei zu schreiben. Ich vermute das SQLite da auch nicht selbst intern dafür sorgt das paralleles schreiben möglich ist. Andere Datenbanken wären vermutlich besser geeignet, aber ich möchte das kleine Projekt nicht durch einen MySQL Server oder ähnliches unnötig komplex machen.
Mit fallen zwei Ansätze an, aber ich bin mir bei beiden nicht sicher ob diese so optimal sind.
1) Eine Queue benutzen
Laut Dokumenation ist die Queue Thread sicher und das parallele reinschreiben kein Problem. Ich würde also aus den verschiedenen Threads erst in die Queue schreiben und dann aus einem Thread heraus die Daten aus der Queue in die Datenbank schreiben. So würde immer nur der eine Thread in die Datenbank schreiben. Diese Variante habe ich schon mal ausprobiert und hat in meinen Tests funktioniert.
2) Mutex benutzen
Ich könnte bevor ich in die Datenbank schreibe einen lock setzen. Da es in meinem Anwendungsfall selten vorkommt das tatsächlich mehrere Threads in die Datenbank schreiben sollte es eigentlich kein Problem sein wenn da mal ein Thread ein paar Millisekunden warten. Da ich nur eine Funktion habe die in die Datenbank schreib wäre die Variante auch schneller umzusetzten als Variante 1.
Was meint ihr, taugen die beiden Varianten in der Praxis und habt ihr vielleicht noch andere Herangehensweisen?