2009-04-20 9 views
4

Ich verwende sqlite, um einen Index einer proprietären Datei zu erstellen, und auf die Datenbank wird mit mehreren Threads (mit verschiedenen sqlite-Handles) zum Lesen und Schreiben zugegriffen.Gibt es bekannte Probleme bei der Verwendung von SQLite und Dateisperren auf verschiedenen Plattformen?

Ich weiß, dass sqlite die Datei sperrt, um Nebenläufigkeit für Leser/Schreiber bereitzustellen, und hängt von der OS-Datei API für die Sperrung ab.

Das ist alles gut unter Windows und Linux, aber auf Solaris und HPux bin ich weniger zuversichtlich, wie Advisory Locking dort funktioniert.

Hat jemand eine Idee, wie gut SQLlite in Bezug auf Nebenläufigkeit auf diesen Plattformen funktioniert?

Antwort

3

Nach meiner Erfahrung (obwohl basierend auf etwas veralteten SQLite-Versionen, dh 3.0.x - 3.2.x) wollen Sie nicht auf SQLites Standard-Sperrimplementierung verlassen, wenn es eine Art von Konkurrenz gibt (auch wenn es nur ein Vielfaches ist) Threads im selben Prozess).

Das Hauptproblem ist, dass SQLite nur für eine kurze Zeit schläft und dann erneut versucht, wenn die Datei gesperrt wurde (bis das Zeitlimit für ausgelastetes Warten abläuft) - dies führt wahrscheinlich zu "Datenbank gesperrt" -Fehlern in der Anwendung. Die von mir implementierte Problemumgehung bestand darin, meine eigene Sperre (mithilfe eines Mutex in einem Multithread-Prozess) zusätzlich zur SQLite-eigenen Sperre zu verwenden.

+1

Das Problem ist, dass ich die gleichzeitige Leseverriegelung verwenden möchte, die sqlite hat. Es soll gleichzeitige Lesevorgänge ermöglichen, bis eine Schreibsperre erworben wurde. Es erhöht die Komplexität meiner Anwendung, um meine eigenen Leser/Schreiber-Sperren zu implementieren, wenn es in SQLite eingebaut werden soll. Es macht mir nichts aus, für eine Weile zu schlafen, während ich eine Operation wiederhole, wenn es beim Lesen der Nebenläufigkeit hilft. Ich hoffe nur, dass es auf allen Plattformen konsistent funktioniert. – Snazzer

Verwandte Themen