2012-06-20 2 views
6

Ich habe eine unglückliche Situation, wo mehrere Perl-Prozesse die gleiche SQLite3-Datenbank zur gleichen Zeit schreiben und lesen.Wie kann dieselbe SQLite3-Datenbank aus mehreren Perl-Prozessen verwendet werden?

Dies führt oft zum Absturz von Perl-Prozessen, da zwei Prozesse gleichzeitig schreiben oder ein Prozess von der Datenbank liest, während der andere versucht, denselben Datensatz zu aktualisieren.

Weiß jemand, wie ich die mehreren Prozesse koordinieren könnte, um mit der gleichen SQLite-Datenbank zu arbeiten?

Ich werde daran arbeiten, dieses System auf eine andere Datenbank-Engine zu verschieben, aber bevor ich das tue, muss ich es irgendwie reparieren, so wie es ist.

+3

Sie sich anschauen sollten an die DB Anschluss eines Objekts DBIx :: Connector, und läuft Ihre Abfragen durch die 'laufen (fixup => ...)' API von DBIx :: Connector. Es wiederholt sich bei einem Fehler und weist eine starke Fehlertoleranz auf. Die 'txn()' Funktion kann in dieser Situation noch besser sein. – DavidO

Antwort

7

SQLite wurde für die Verwendung in mehreren Prozessen entwickelt. Es gibt einige Ausnahmen, wenn Sie die sqlite-Datei auf einem Netzlaufwerk hosten und es möglicherweise eine Möglichkeit gibt, sie so zu kompilieren, dass sie von einem Prozess verwendet wird, aber ich verwende sie regelmäßig aus mehreren Prozessen. Versuchen Sie, den Zeitüberschreitungswert zu erhöhen, wenn Probleme auftreten. SQLite verwendet die Dateisystemsperren, um die Daten vor gleichzeitigem Zugriff zu schützen. Wenn ein Prozess in die Datei schreibt, muss möglicherweise ein zweiter Prozess warten. Ich habe meine Timeouts auf 3 Sekunden eingestellt und habe damit sehr wenig Probleme.

Here is the link to set the timeout value

+0

Langfristige Details: http://www.sqlite.org/docs.html/SQLite Technische/Design-Dokumentation – biziclop