1.概述
SQLite支持三種不同的線程模式:
- 單線程。在此模式下,所有互斥鎖都被禁用,并且SQLite一個鏈接不能在多個線程中使用。
- 多線程。在這種模式下,只要在兩個或多個線程中不同時使用單個數據庫連接,SQLite就可以被多個線程安全地使用。
- 串行模式。在串行模式下,SQLite可以被多個線程安全地使用而沒有任何限制。
可以在編譯時(從源代碼編譯SQLite庫時)或在啟動時(當使用SQLite的應用程序正在初始化時)或在運行時(當已經創建了SQLite數據庫鏈接時)選擇對應的線程模式來創建連接)。一般來說,運行時會覆蓋啟動時,啟動時會覆蓋編譯時的配置。需要強調的是,一旦選了單線程模式就無法覆蓋。
注意:默認的模式是串行模式。
2.編譯時選擇線程模式
編譯時參數使用SQLITE_THREADSAFE表示線程模式。如果編譯時參數不存在SQLITE_THREADSAFE,則使用串行模式。這可以通過-DSQLITE_THREADSAFE = 1顯式化 。使用 -DSQLITE_THREADSAFE = 0時,線程模式是單線程。使用 -DSQLITE_THREADSAFE = 2時,線程模式是多線程的。
sqlite3_threadsafe()接口 的返回值由編譯時線程模式選擇決定。如果在編譯時選擇了單線程模式,則sqlite3_threadsafe()返回false。如果選擇了多線程或串行模式,則 sqlite3_threadsafe()返回true。該sqlite3_threadsafe() 接口早在多線程模式和啟動時間和運行時間模式選擇,因此是無法多線程和串行模式,也沒有區分是它能夠報告開始時間或運行時模式的變化。
如果在編譯時選擇單線程模式,則從編譯中忽視一些重要的邏輯,所以無法在啟動時或運行時啟用多線程或串行模式。
3.線程模式的開始時間選擇
假設編譯時線程模式不是單線程,則可以在初始化期間使用sqlite3_config()接口更改線程模式 。該SQLITE_CONFIG_SINGLETHREAD動詞設置SQLite為單線程模式,SQLITE_CONFIG_MULTITHREAD 動詞設置SQLite為多線程模式,SQLITE_CONFIG_SERIALIZED動詞設置SQLite為串行模式。
4.運行時選擇串行模式
如果在編譯時或啟動時未選擇單線程模式,則可以將單個數據庫連接創建為多線程或串行化。無法將單個數據庫連接降級為單線程模式。如果編譯時或開始時模式是單線程,也不可能升級單個數據庫連接。
單個數據庫連接的線程模式由作為sqlite3_open_v2()的第三個參數給出的標志確定。所述 SQLITE_OPEN_NOMUTEX標志導致數據庫連接是在多線程模式和SQLITE_OPEN_FULLMUTEX標志使是在串行化模式的連接。如果未指定任何標志或者使用 sqlite3_open()或sqlite3_open16()而不是sqlite3_open_v2(),則使用由編譯時和開始時設置確定的默認模式。