2010-07-16 74 views
9

我有一個需要高性能參考數據查找功能的多線程Linux C++應用程序。我一直在考慮使用內存中的SQLite數據庫,但無法在多線程環境中看到這種擴展方法。我是否可以實現對內存中SQLite數據庫的可伸縮多線程訪問

即使所有事務都是隻讀的,默認線程模式(序列化)似乎也會受到單個粗粒度鎖的影響。此外,我不相信我可以使用多線程模式,因爲我無法創建到單個內存數據庫的多個連接(因爲每次調用sqlite3_open(「:memory:」,& db)都會創建一個單獨的in-內存數據庫)。

所以我想知道的是:有沒有我在文檔中遺漏的東西,並且可能有多個線程從我的C++應用程序共享對同一個內存數據庫的訪問。

另外,是否有一些替代SQLite,我可以考慮?

回答

0

不,使用SQLite,您無法從不同的線程訪問相同的內存數據庫。這是設計。更多信息在SQLite documentation

+2

由於您引用的頁面是內存數據庫中唯一的文檔,因此我已經閱讀它並不奇怪。它沒有提到不能通過設計從多個線程訪問,事實上我的應用程序在多線程中工作得很好 - 它只是在添加線程時不會擴展。 – Fergus 2010-07-16 17:05:25

+0

歡迎來到您的第一個贊!值得提一杯酒,我想;) – mlvljr 2012-09-29 22:01:03

6

是的! 看到以下從文檔提取的: http://www.sqlite.org/inmemorydb.html

但它不是以DB存儲器的直接連接,而不是到共享cache.Its一種解決方法。看照片。

Multiple connections to SQLite in-memory DB by shared cache

在內存數據庫以及共享高速緩存

內存數據庫被允許使用共享高速緩存,如果他們使用的是URI的文件名打開。如果使用未經修改的「:memory:」名稱來指定內存數據庫,那麼該數據庫始終有一個私有緩存,並且僅對原來打開它的數據庫連接纔可見。然而,相同的內存數據庫可以由兩個或更多的數據庫連接如下打開:

rc = sqlite3_open("file::memory:?cache=shared", &db); 

或者,

ATTACH DATABASE 'file::memory:?cache=shared' AS aux1; 

這允許單獨的數據庫連接到共享相同的內存數據庫。當然,共享內存數據庫的所有數據庫連接都需要處於相同的過程中。當數據庫的最後一次連接關閉時,數據庫會自動刪除並回收內存。

如果兩個或更多個不同的但可共享內存需要在一個單一的過程數據庫,則模式=存儲器查詢參數可以與URI的文件名被用來創建一個名爲內存數據庫:

rc = sqlite3_open("file:memdb1?mode=memory&cache=shared", &db); 

或者,

ATTACH DATABASE 'file:memdb1?mode=memory&cache=shared' AS aux1; 

當內存數據庫以這種方式命名的,它只會與使用完全相同的名稱的另一個連接共享緩存。

相關問題