Seite 1 von 1

SQLite - Parallelzugriff

Verfasst: Donnerstag 19. Juli 2007, 18:24
von JanDMC
Moin Leute,

ich wollte gerne ma wissen ob es Problematisch ist, wenn man auf EINE SQLite DB parallel zugreift, schreibend sowie lesend. Das es möglich ist, weiß ich aber hab glaub mal gelesen das es nicht empfehlenswert ist.


mfg :D Jan :D

Re: SQLite - Parallelzugriff

Verfasst: Donnerstag 19. Juli 2007, 18:47
von gerold
Hallo Jan!

http://www.sqlite.org/faq.html#q5

mfg
Gerold
:-)

Verfasst: Donnerstag 19. Juli 2007, 19:08
von JanDMC
Danke für die Antwort. Folglich wäre es nicht Ratsam parallel auf die SQLite Datenbank zuzugreifen bzw zu schreiben.
Der Grund warum ich das Nachgefragt hab, ist folgender:
Ich habe ein Programm mit meherern Threads. Wenn ich eine Verbindung zur SQLIte Datenbank aufbaue, kann ich diese Verbindung nicht in anderen Threads benutzen, deswegen wollte ich in jeden Thread der gestatet wird eine weitere Verbindung aufbauen.

Gib es evtl doch eine Möglichkeit auf die DB zuzugreifen aus 'allen' Threads z.B. durch ein flag oder ähnliches?.

mfg

Jan

Verfasst: Donnerstag 19. Juli 2007, 20:06
von Leonidas
Du nimmst einen Thread, der sich nur um die Datenbank kümmert und lässt andere Threads auf diesen zugreifen.

Verfasst: Donnerstag 19. Juli 2007, 20:12
von EyDu
Ich hatte erst vor kurzem ein ähnliches Problem: klick mich.

Verfasst: Donnerstag 19. Juli 2007, 21:00
von gerold
JanDMC hat geschrieben:Wenn ich eine Verbindung zur SQLIte Datenbank aufbaue, kann ich diese Verbindung nicht in anderen Threads benutzen, deswegen wollte ich in jeden Thread der gestatet wird eine weitere Verbindung aufbauen.
Hallo Jan!

Du kannst ohne Weiteres je Thread eine eigene Verbindung zur SQLite-Datenbank aufbauen. pysqlite wurde so programmiert, dass es keine Probleme damit geben sollte. (Fehler ausgenommen ;-) )

Ich habe auf der pysqlite-Website immer wieder Hinweise gefunden, dass es funktionieren sollte.

Allerdings wird davor gewarnt, eine Verbindung in mehreren Threads zu benutzen. Es gibt sogar eine eigene Prüfung dafür, damit dieser Fehler nicht passieren kann.

--> Jeder Thread bekommt eine Connection.

Ich weiß leider nicht, ob pysqlite intern die Fehler SQLITE_BUSY und SQLITE_LOCKED abfängt oder ob du selber darauf reagieren musst. Wenn pysqlite selber darauf reagiert, dann musst du nichts mehr machen. Wenn pysqlite den Fehler an dein Programm weiter gibt, dann musst du dich selber darum kümmern, dass die letze Transaktion nach einer kurzen Verschnaufpause wiederholt wird.

Ein Tipp noch:

Code: Alles auswählen

try:
    from pysqlite2 import dbapi2 as sqlite3
except ImportError:
    import sqlite3
Versuche immer zuerst raus zu finden, ob pysqlite installiert wurde. Dies ist *immer* neuer als die in Python 2.5 eingebaute Version. Je neuer, desto weniger Probleme macht pysqlite, da immer mehr Fehler ausgebessert werden. Auch wenn Python 2.5 schon pysqlite als "sqlite3" mit bringt, empfehle ich dir immer, die neueste Version von http://www.initd.org/tracker/pysqlite/wiki/pysqlite zu installieren.

Code: Alles auswählen

import sqlite3
sqlite3.threadsafety # =1
sqlite3.threadsafety ergibt bei mir unter Windows, unter Debian, unter Ubuntu (etwas älter) und Ubuntu (aktuell) jeweils 1.
pysqlite ist also so kompiliert, dass es Threading unterstützt. Getestet unter Python 2.3.5, 2.4.x und 2.5.1.

mfg
Gerold
:-)

Verfasst: Freitag 20. Juli 2007, 10:53
von JanDMC
Danke für die Antworten,
ich habe das jetzt getestet mit mehreren Zugriffen bis jetzt kam noch kein Fehler..

mfg Jan

Database lock

Verfasst: Sonntag 22. Juli 2007, 19:50
von OpenPavilion
Sqlite "locked" die Datenbank beim Schreib-/Änderungszugriff. Es gibt mehrere Levels von Zugriffsbegrenzen. Immer dann, wenn man eine BEGIN TRANSACTION bewusst oder implizit auslöst (z.B. beim Start eines INSERTS oder UPDATES etc.), dann ist die Dantebank solange geschlossen gegen anderen Zugriffe, bis entweder die Connection des Schreibprozesses endet oder ein END TRANSACTION nachgeschickt wurde.

Gruss
Pavilion