2012-07-31 14 views
11

Ich habe eine Anwendung, die SQLite (Version 3.7.2) verwendet, um Daten zu speichern. Ich habe eine SQLite-Verbindung zwischen mehreren Threads geteilt, die aus derselben SQLite-Datenbank schreibt und liest. SQLite wird mit DSQLITE_THREADSAFE = 1 kompiliert, was bedeutet, dass SQLite im Serialisierungsmodus ist.SQLite: Verbindungen über Threads zum Lesen und Schreiben freigeben

von SQLite docs

Serialized Zitiert: In serialisierten Modus SQLite kann durch mehrere Threads ohne Einschränkung sicher verwendet.

Im Gegenteil des SQLite Wiki Eintrag sagt

nicht die gleiche Datenbankverbindung zur gleichen Zeit in mehr als ein Thread Verwenden Sie

ich mit einer Beispielanwendung versucht, den Spawns Hunderte von Threads und teilt eine SQLite-Handle zu lesen & schreiben, die gut funktioniert.

So ist der SQLite Wiki-Eintrag veraltet oder SQLite ist möglicherweise nicht in der Lage, Lesen und Schreiben von verschiedenen Threads zur gleichen Zeit mit der gleichen Verbindung zu behandeln?

Antwort

7

EDIT

DSQLITE_THREADSAFE = 2: Multi-Thread-Modus Der Begriff "multi-thread" etwas verwirrt in SQLite ist. Es scheint, als ob Sie im Multi-Thread-Modus keine Verbindung mit anderen Threads teilen können, da die Verbindung selbst keine Mutexe verwendet, um zu verhindern, dass ein Thread die Verbindung ändert, während ein anderer Thread sie verwendet.

DSQLITE_THREADSAFE = 1: serialisierten Modus jedoch in serialisierten Modus, es wird die Daten-Datei sperren und Mutexe verwenden Sie den Zugriff für die gemeinsame Verbindung zu steuern.

Aus docs: ... wenn SQLite mit SQLITE_THREADSAFE = 1 kompiliert wird, serialisiert die SQLite-Bibliothek selbst den Zugriff auf Datenbankverbindungen und vorbereitete Anweisungen, damit die Anwendung dieselbe Datenbankverbindung oder dieselbe vorbereitete Anweisung verwenden kann in verschiedenen Threads gleichzeitig.

Also, wenn sie mit Verbindungen zu tun, serialisierten Modus ist thread-safe aber Multi-Thread Modus ist nicht, obwohl Sie noch mehrere Verbindungen zu derselben Datenbank hat.

Quelle: http://www.sqlite.org/c3ref/c_config_getmalloc.html#sqliteconfigmultithread

Grüße!

+2

Ich habe das gelesen, aber ich fragte mich, ob das Wiki veraltet war oder SQLite-Verbindung jetzt unterstützt "liest" und "schreibt" aus der gleichen Verbindung von mehreren Threads? – omggs

+0

@omggs du hast Recht. Die Begriffe sind in SQLite-Dokumenten etwas verwirrend. Für mich * Multi-Thread * und * serialized * war das gleiche, aber sie sind nicht. Ich benutze serialisierte Verbindungen aber nicht geteilt zwischen Threads ... und jetzt habe ich gelernt, dass es sicher ist, zu teilen :) – devundef

+1

Danke für die Bestätigung! SQLite Wiki ist in der Tat veraltet !!! – omggs

0

Es ist eine schlechte Idee, eine Verbindung zwischen mehr als einem Thread zu teilen, wenn Sie DSQLITE_THREADSAFE haben = 0

Thread Stellen Sie sich vor 1 Ausführen dieses Code:

1. connection.setAutoCommit(false); 
2. statement.executeUpdate(sql); 
3. connection.commit(); 

und Thread 2 ausgeführt wird diese Code zur gleichen Zeit:

1. connection.setAutoCommit(true); 

was nun, wenn der Befehl 1 von THREAD 2 genau VOR Befehl ausgeführt 3 des Gewindes 1? Sie erhalten wahrscheinlich eine SQLException mit der Meldung "Datenbank im Auto-Commit-Modus" (da die Methoden zum automatischen Festschreiben für dasselbe Connection-Objekt ausgeführt werden).

Das bedeutet, man seinen Code Erz Verwendung DSQLITE_THREADSAFE = 1

Mit Connection Pooling auch das Beste sein würde synchronisieren sollten, wenn Sie gonna develope Multi-Thread-Code sind, von dem Sie eine bessere Leistung erhalten, wenn Sie für eine andere entscheiden entscheiden DBMS.

Verwandte Themen