2012-04-26 3254 views
44

我有一個由兩個進程使用的SQLite數據庫。我想知道,使用最新版本的SQLite,當一個進程(連接)啓動一個事務來寫入數據庫時​​,另一個進程是否可以同時從數據庫中讀取?我可以從多個連接同時讀寫SQLite數據庫嗎?

+0

相關問題請看這裏.. http:// stackoverflow。com/questions/12117016/strategies-for-concurrent-read-writing-and-reading-in-sqlite/24038860#24038860 – Nepster 2014-06-04 13:35:50

回答

76

我收集的信息從各種來源,大部分來自sqlite.org,並把它們放在一起:

首先,默認情況下,多個進程可以有相同的SQLite數據庫在同一時間打開,幾個讀訪問可以平行滿足。

在寫入的情況下,對數據庫的單次寫入會在短時間內鎖定數據庫,即使是讀取,也不會有任何內容訪問數據庫文件。

從版本3.7.0開始,提供了一個新的「Write Ahead Logging」 (WAL)選項,其中讀取和寫入可以同時進行。

默認情況下,WAL未啓用。要打開WAL,請參閱SQLite文檔。

+0

journal_mode = WAL解決了我的問題! – 2015-08-21 06:55:36

11

SQLite3的明確允許multiple connections

(5)多個應用程序或同一 應用訪問,同時一個單一的數據庫文件中的多個實例?

多個進程可以同時打開同一個數據庫。 多個進程可以同時做一個SELECT。但是,只有 一個進程可以在 的任何時刻對數據庫進行更改。

用於共享連接,使用SQLite3 shared cache

與3.3.0版本開始,SQLite的包括一個特殊的 「共享緩存」 模式(默認禁用)

在版本3.5.0,共享高速緩存模式被修改,以便可以在整個進程中共享同一個 高速緩存,而不是在單個線程內共享。

5.0啓用共享高速緩存模式

共用高速緩衝存儲器模式是基於每個進程的基礎上啓用。使用C 接口,以下API可用於全局啓用或禁用 共享高速緩存模式:

INT sqlite3_enable_shared_cache(INT);

每個呼叫sqlite3_enable_shared_cache()的影響隨後的數據庫使用sqlite3_open(),sqlite3_open16(創建 連接),或 sqlite3_open_v2()。已經存在的數據庫連接是 不受影響。每次調用sqlite3_enable_shared_cache()都將覆蓋以前在同一進程中調用的所有 。

相關問題