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 Jan
SQLite - Parallelzugriff
joa nää python is toll :D
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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
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
Ich hatte erst vor kurzem ein ähnliches Problem: klick mich.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Jan!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.
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
Code: Alles auswählen
import sqlite3
sqlite3.threadsafety # =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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Danke für die Antworten,
ich habe das jetzt getestet mit mehreren Zugriffen bis jetzt kam noch kein Fehler..
mfg Jan
ich habe das jetzt getestet mit mehreren Zugriffen bis jetzt kam noch kein Fehler..
mfg Jan
joa nää python is toll :D
-
- User
- Beiträge: 5
- Registriert: Sonntag 22. Juli 2007, 19:45
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
Gruss
Pavilion