SQLite: Sharing-Verbindungen über threads zu Lesen und zu schreiben
Ich habe eine Anwendung nutzt SQLite(version 3.7.2), um Daten zu speichern. Ich habe eine SQLite-Verbindung von mehreren threads gemeinsam genutzt wird, schreibt und liest aus der gleichen SQLite-db. SQLite kompiliert wird mit DSQLITE_THREADSAFE=1, was bedeutet, SQLite ist im Serialisierten Modus.
Zitat aus SQLite-docs
Serialisiert: Im serialisierten Modus, SQLite kann sicher verwendet werden, die von mehreren
threads ohne Einschränkung.
Im Gegenteil, die SQLite-Wiki Eintrag sagt
Verwenden Sie nicht die gleiche Datenbank-Verbindung zur gleichen Zeit in mehr als
ein thread
Ich versuchte mit einer Beispielanwendung, die spawns Hunderte von threads und Aktien eine SQLite-handle zum Lesen & schreiben, das ist in Ordnung.
So ist die SQLite-wiki-Eintrag veraltet oder SQLite möglicherweise nicht in der Lage zu handhaben, Lesen und schreiben geschieht aus verschiedenen threads gleichzeitig über die gleiche Verbindung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
BEARBEITEN
DSQLITE_THREADSAFE=2: multi-thread-Modus
Der Begriff "multi-thread" ist ein bisschen verwirrt in SQLite. Scheint, wie die in den Multi-thread-Modus kann man nicht teilen die Verbindung mit anderen threads, weil die Verbindung selbst wird nicht verwenden Sie es, um zu verhindern, dass ein thread, um die Verbindung ändern, während ein anderer thread ist.
DSQLITE_THREADSAFE=1: serialisiert Modus
Jedoch, in serialisiert - Modus, wird es sperren Sie die Datenbank und verwenden Mutexe zum Steuern des Zugriffs für die gemeinsam genutzte Verbindung.
Aus docs:
... wenn SQLite kompiliert wird mit SQLITE_THREADSAFE=1 ist die SQLite-Bibliothek wird selbst serialisieren Zugang zu den Datenbank-verbindungen und Anweisungen vorbereitet, so dass die Anwendung ist kostenlos zu benutzen die gleiche Datenbank-Verbindung oder der gleichen vorbereitet-Anweisung, die in verschiedenen threads gleichzeitig.
So, beim Umgang mit verbindungen, serialisierten Modus ist thread-safe aber multi-thread - Modus nicht, obwohl Sie immer noch mehrere verbindungen zu derselben Datenbank.
Quelle: http://www.sqlite.org/c3ref/c_config_getmalloc.html#sqliteconfigmultithread
Grüße!
reads
undwrites
von der gleichen Verbindung aus mehreren threads?Dass es eine schlechte Idee zu teilen, eine Verbindung zu mehr als einem thread, wenn Sie DSQLITE_THREADSAFE=0
Stellen Sie sich Ihr GEWINDE 1 wird dieser code ausgeführt:
und dein THREAD 2 ausgeführt wird, diesen code in der gleichen Zeit:
Was nun, wenn die Anweisung 1 von THREAD 2 ausgeführt wird, genau VOR dem Unterricht 3 THREAD 1? Sie erhalten wahrscheinlich eine SQLException mit der Fehlermeldung "Datenbank in der auto-commit-Modus" (da der auto-commit-Methoden ausgeführt werden, auf das gleiche Connection-Objekt).
Heißt das, man sollte die Synchronisierung seinen code Erz verwenden DSQLITE_THREADSAFE=1
Verbindungspooling wäre auch das beste, wenn Sie sind gonna entwickeln Sie multithread-code, von der aus Sie eine bessere Leistung, wenn Sie sich entscheiden, entscheiden Sie sich für ein anderes DBMS.