SQLite - Parallelzugriff

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
JanDMC
User
Beiträge: 95
Registriert: Donnerstag 23. September 2004, 19:35
Kontaktdaten:

SQLite - Parallelzugriff

Beitragvon JanDMC » Donnerstag 19. Juli 2007, 18:24

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
joa nää python is toll :D
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: SQLite - Parallelzugriff

Beitragvon gerold » Donnerstag 19. Juli 2007, 18:47

Hallo Jan!

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

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JanDMC
User
Beiträge: 95
Registriert: Donnerstag 23. September 2004, 19:35
Kontaktdaten:

Beitragvon JanDMC » Donnerstag 19. Juli 2007, 19:08

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
joa nää python is toll :D
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 19. Juli 2007, 20:06

Du nimmst einen Thread, der sich nur um die Datenbank kümmert und lässt andere Threads auf diesen zugreifen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
EyDu
User
Beiträge: 4868
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Donnerstag 19. Juli 2007, 20:12

Ich hatte erst vor kurzem ein ähnliches Problem: klick mich.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Donnerstag 19. Juli 2007, 21:00

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JanDMC
User
Beiträge: 95
Registriert: Donnerstag 23. September 2004, 19:35
Kontaktdaten:

Beitragvon JanDMC » Freitag 20. Juli 2007, 10:53

Danke für die Antworten,
ich habe das jetzt getestet mit mehreren Zugriffen bis jetzt kam noch kein Fehler..

mfg Jan
joa nää python is toll :D
OpenPavilion
User
Beiträge: 5
Registriert: Sonntag 22. Juli 2007, 19:45

Database lock

Beitragvon OpenPavilion » Sonntag 22. Juli 2007, 19:50

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder