小巧、快速、可靠。
任選三項。
在多執行緒應用程式中使用 SQLite

1. 概觀

SQLite 支援三種不同的執行緒模式

  1. 單執行緒。在此模式中,所有互斥鎖都已停用,而且 SQLite 不安全,無法一次在多個執行緒中使用。

  2. 多執行緒。在此模式中,如果沒有任何單一 資料庫連線 或任何衍生自資料庫連線的物件(例如 已準備好的陳述式)同時在兩個或更多執行緒中使用,則 SQLite 可以安全地由多個執行緒使用。

  3. 序列化。在序列化模式中,可以安全地從多個執行緒進行 API 呼叫,以影響或使用任何 SQLite 資料庫連線 或任何衍生自此類資料庫連線的物件。對個別物件的影響與從單一執行緒以相同順序進行所有 API 呼叫的效果相同。「序列化」這個名稱源自於 SQLite 使用互斥鎖將存取序列化至每個物件的事實。

執行緒模式可以在編譯時(當 SQLite 函式庫從原始碼編譯時)、啟動時(當打算使用 SQLite 的應用程式正在初始化時)或執行時(當正在建立新的 SQLite 資料庫連線時)進行選擇。一般來說,執行時會覆寫啟動時,而啟動時會覆寫編譯時。不過,一旦選擇單執行緒模式,就無法覆寫。

預設模式為序列化。

2. 執行緒模式的編譯時選擇

使用 SQLITE_THREADSAFE 編譯時間參數來選擇執行緒模式。如果沒有 SQLITE_THREADSAFE 編譯時間參數,則使用序列化模式。這可以使用 -DSQLITE_THREADSAFE=1 明確表示。使用 -DSQLITE_THREADSAFE=0,執行緒模式為單執行緒。使用 -DSQLITE_THREADSAFE=2,執行緒模式為多執行緒。

sqlite3_threadsafe() 介面的傳回值是編譯時設定的 SQLITE_THREADSAFE 值。它不會反映透過 sqlite3_config() 介面或作為 sqlite3_open_v2() 的第三個引數給定的旗標在執行時期對執行緒模式所做的變更。

如果在編譯時選擇單執行緒模式,則會從建置中省略重要的互斥鎖定邏輯,而且不可能在啟動時或執行時啟用多執行緒或序列化模式。

3. 執行緒模式的啟動時選擇

假設編譯時執行緒模式不是單執行緒,則可以使用 sqlite3_config() 介面在初始化期間變更執行緒模式。 SQLITE_CONFIG_SINGLETHREAD 動詞將 SQLite 設定為單執行緒模式, SQLITE_CONFIG_MULTITHREAD 動詞設定多執行緒模式,而 SQLITE_CONFIG_SERIALIZED 動詞設定序列化模式。

4. 執行緒模式的執行時選擇

如果在編譯時或啟動時未選擇單執行緒模式,則可以將個別資料庫連線建立為多執行緒或序列化。無法將個別資料庫連線降級為單執行緒模式。如果編譯時或啟動時模式為單執行緒,也無法升級個別資料庫連線。

個別資料庫連線的執行緒模式是由傳遞給 sqlite3_open_v2() 的第三個參數所決定的旗標。 SQLITE_OPEN_NOMUTEX 旗標會讓資料庫連線進入多執行緒模式,而 SQLITE_OPEN_FULLMUTEX 旗標會讓連線進入序列化模式。如果沒有指定任何旗標,或使用 sqlite3_open()sqlite3_open16() 取代 sqlite3_open_v2(),則會使用編譯時期和啟動時期設定所決定的預設模式。

此頁面最後修改於 2023-12-05 14:43:20 UTC