Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erläuterung zur Verwendung von SQLite-Multithreading

Ausführliche Erläuterung zur Verwendung von SQLite-Multithreading

Y2J
Y2JOriginal
2017-05-11 11:39:281669Durchsuche

SQLite unterstützt 3 Thread-Modi:
Einzelthread: In diesem Modus gibt es keinen gegenseitigen Ausschluss und Multithreading ist unsicher. Deaktivieren Sie alle Mutex-Sperren. Bei gleichzeitiger Verwendung treten Fehler auf. Es wird aktiviert, wenn der Parameter SQLITE_THREADSAFE=0 beim Kompilieren von SQLite hinzugefügt wird oder wenn sqlite3_config(SQLITE_CONFIG_SINGLETHREAD) vor der Initialisierung von SQLite aufgerufen wird.

Multithreading: In diesem Modus ist eine Datenbankverbindung sicher, solange sie nicht von mehreren Threads gleichzeitig verwendet wird. Im Quellcode ist bCoreMutex aktiviert und bFullMutex deaktiviert. Tatsächlich werden die Sperren für die Datenbankverbindung und die vorbereitete Anweisung (vorbereitete Anweisung) deaktiviert, sodass dieselbe Datenbankverbindung oder vorbereitete Anweisung nicht gleichzeitig in mehreren Threads verwendet werden kann. Es ist standardmäßig aktiviert, wenn der Parameter SQLITE_THREADSAFE=2 beim Kompilieren von SQLite hinzugefügt wird. Wenn SQLITE_THREADSAFE nicht 0 ist, können Sie sqlite3_config(SQLITE_CONFIG_MULTITHREAD) aufrufen, um es zu aktivieren, bevor Sie SQLite initialisieren; oder wenn Sie eine Datenbankverbindung erstellen, setzen Sie das Flag SQLITE_OPEN_NOMUTEX.

Seriennummer: SQLite ist threadsicher. Aktivieren Sie alle Sperren, einschließlich bCoreMutex und bFullMutex. Da sowohl die Datenbankverbindung als auch die vorbereitete Anweisung gesperrt sind, können Multithreads diese Objekte nicht gleichzeitig verwenden und es wird seriell. Es ist standardmäßig aktiviert, wenn der Parameter SQLITE_THREADSAFE =1 beim Kompilieren von SQLite hinzugefügt wird. Wenn SQLITE_THREADSAFE nicht 0 ist, können Sie sqlite3_config(SQLITE_CONFIG_SERIALIZED) aufrufen, um es vor der Initialisierung von SQLite zu aktivieren, oder beim Erstellen einer Datenbankverbindung das Flag SQLITE_OPEN_FULLMUTEX setzen.

Die hier erwähnte Initialisierung bezieht sich auf den Aufruf der Funktion sqlite3_initialize() Diese Funktion wird automatisch aufgerufen, wenn sqlite3_open() aufgerufen wird, und nur der erste Aufruf ist gültig.

Um Thread-Sicherheit zu erreichen, muss SQLite beim Kompilieren das Vorverarbeitungsmakro SQLITE_THREADSAFE auf 1 setzen. Unter Windows und

Linux ist dies die Einstellung in gut kompilierten Binärdistributionen. Wenn Sie nicht sicher sind, ob die von Ihnen verwendete Bibliothek threadsicher ist, können Sie sqlite3_threadsafe() interface aufrufen, um dies herauszufinden. Rufen Sie sqlite3_threadsafe() auf, um den SQLITE_THREADSAFE-Parameter zur Kompilierungszeit abzurufen.

Das heißt, der Thread-Modus kann zur Kompilierungszeit (wenn die SQLite-Bibliothek aus dem Quellcode kompiliert wird), beim Start (wenn die Anwendung, die SQLite verwendet, initialisiert wird) oder zur Laufzeit (wenn die Datenbank) angegeben werden Verbindung entsteht). Im Allgemeinen überschreibt der zur Laufzeit angegebene Modus den beim Start angegebenen Modus und der beim Start angegebene Modus überschreibt den zur Kompilierungszeit angegebenen Modus. Sobald jedoch der Single-Threaded-Modus angegeben ist, kann er nicht überschrieben werden. Der Standard-Thread-Modus ist der serielle Modus.

Thread-Modus beim Kompilieren auswählen

Sie können den Thread-Modus angeben, indem Sie das Makro SQLITE_THREADSAFE definieren. Wenn nicht angegeben, wird standardmäßig der serielle Modus verwendet. Definieren Sie das Makro SQLITE_THREADSAFE=1, um die Verwendung des seriellen Modus anzugeben; =0, um den Single-Thread-Modus zu verwenden; =2, um den Multi-Thread-Modus zu verwenden.

sqlite3_threadsafe()
Der Rückgabewert der Funktion kann den zur Kompilierungszeit angegebenen Thread-Modus bestimmen. Wenn der Single-Threaded-Modus angegeben ist, gibt die Funktion „false“ zurück. Wenn der serielle oder Multithread-Modus angegeben ist, gibt die Funktion „true“ zurück. Da die Funktion sqlite3_threadsafe() dem Multithread-Modus und der Modusauswahl beim Start und zur Laufzeit vorangeht, kann sie nicht zwischen Multithread-Modus und seriellem Modus oder zwischen Start- und Laufzeitmodus unterscheiden.
Der letzte Satz kann durch die Implementierung der sqlite3_threadsafe-Funktion SQLITE_
API int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; } verstanden werden Zur Kompilierungszeit wird die kritische Mutex-Logik zur Konstruktionszeit weggelassen, sodass beim Start oder zur Laufzeit kein serieller Modus oder Multithread-Modus angegeben werden kann.

Thread-Modus beim Start auswählen

Wenn der Single-Thread-Modus zur Kompilierungszeit nicht angegeben ist, können Sie die Funktion sqlite3_config() verwenden, um den Thread-Modus während der Anwendungsinitialisierung zu ändern. Der Parameter SQLITE_CONFIG_SINGLETHREAD kann als
Single-Thread-Modus, SQLITE_CONFIG_MULTITHREAD als Multi-Thread-Modus und SQLITE_CONFIG_SERIALIZED als serieller Modus angegeben werden.

Thread-Modus zur Laufzeit auswählen
Wenn der Single-Thread-Modus zur Kompilierungszeit oder beim Start nicht angegeben wird, kann jede Datenbankverbindung beim Erstellen einzeln als Multi-Thread-Modus oder serieller Modus angegeben werden, kann jedoch nicht für Single-Threaded-Modus angegeben werden. Thread-Modus. Wenn zur Kompilierungszeit oder beim Start der Single-Thread-Modus angegeben wird, können Sie beim Erstellen der Verbindung keinen Multi-Thread- oder seriellen Modus angeben.

Verwenden Sie den dritten Parameter der Funktion sqlite3_open_v2(), um den Thread-Modus beim Erstellen einer Verbindung anzugeben. SQLITE_OPEN_NOMUTEX identifiziert eine im Multithread-Modus erstellte Verbindung; SQLITE_OPEN_FULLMUTEX identifiziert eine im seriellen Modus erstellte Verbindung. Wenn kein Bezeichner angegeben ist oder die Funktion sqlite3_open() oder sqlite3_open16() zum Erstellen einer Datenbankverbindung verwendet wird, wird der Thread-Modus, der zur Kompilierungszeit oder Startzeit angegeben wurde, als Standard-Thread-Modus verwendet.

[Verwandte Empfehlungen]

1. XML-kostenloses Video-Tutorial

2. Li Yanhui XHTML-Video-Tutorial

3. XML Technisches Handbuch

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung zur Verwendung von SQLite-Multithreading. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn