2016-09-30 135 views
0

我正在創建一個監視應用程序。我想讀取來自所有服務器的查詢並將其存儲在sqlite文件中。只要需要就顯示。我正在使用C++編寫此應用程序 - 從多個服務器獲取數據並將其存儲到單個sqlite數據庫。我正在使用單獨的線程從多個服務器獲取數據。如果我直接讀取和寫入數據給sqlite,那麼它可能會鎖定sqlite文件,因爲100個線程將同時寫入。 從多個線程將數據寫入sqlite的最佳方式是什麼?從多個線程將數據寫入sqlite的最佳方法

+1

[The XY solution](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem):考慮用'select','epoll',重疊的IO減少線程數或任何IO多路複用器最適合您的操作系統。 – user4581301

+0

編輯我的問題。我不能減少線程數量,這取決於連接的服務器數量。 –

+1

沒錯,但是使用多路複用器,一個線程可以管理許多服務器。 – user4581301

回答

2

如果你不能控制同時寫入操作的數量,我認爲沒有更好的方法來用sqlite做到這一點。

SQLite不是爲您的用例而設計的。考慮切換到客戶端/服務器RDBMS。這也是什麼SQLite的建議:

https://www.sqlite.org/whentouse.html

情況下如果有很多客戶端程序的客戶機/服務器RDBMS可能更

客戶/服務器應用

通過網絡將SQL發送到同一個數據庫,然後使用客戶端/服務器數據庫引擎而不是SQLite。 SQLite將通過網絡文件系統工作,但由於與大多數網絡文件系統相關的延遲,性能不會很好。另外,文件鎖定邏輯在許多網絡文件系統實現中(在Unix和Windows上)都是有問題的。如果文件鎖定不能 正常工作,兩個或多個客戶端可能會嘗試同時修改相同數據庫的相同部分 ,從而導致損壞。 因爲這個問題是由底層文件系統 實現中的錯誤引起的,所以SQLite沒有辦法阻止它。

一個好的經驗規則是爲了避免在相同的數據庫將被直接從多臺計算機通過網絡 訪問(沒有中間 應用服務器),並同時情況使用SQLite。

(...)

高併發

SQLite支持同時讀者的數量不受限制,但只允許一個作家在任何時刻。對於很多 的情況,這不是問題。作家排隊。每個應用程序 都會快速完成其數據庫工作並繼續前進,並且不會發生超過幾十毫秒的鎖定,並且該鎖定持續時間爲 。但有一些應用程序需要更多的併發性,並且這些應用程序可能需要尋求 一個不同的解決方案。

-1

對於所有線程只使用一個sqlite數據庫連接,打開時用標記SQLITE_OPEN_FULLMUTEX設置。 然後數據庫將序列化來自所有線程的寫入,並且不會鎖定。 但是您需要調整數據庫和應用程序設計,以便寫入查詢運行得足夠快,需要多少。

+0

FULLMUTEX是最鎖定,而不是鎖定。它也隻影響連接對象,因爲各種原因(每個線程應該有自己的連接),不應該在線程間共享連接對象。 –

+0

對於最後的數據庫寫操作,您始終鎖定錶行和/或表頁,這可能會導致死鎖。總是建議只有一個數據庫寫入器線程/進程或使用FULLMUTEX。 額外的改進可以是寫入相同表的線程應該有鎖定和線程寫入不同的表。 對於讀取操作,不需要序列化,它們可以並行運行。 – BJovke

+0

SQLite對整個數據庫使用一個鎖。不存在僵局的可能性。再次,'FULLMUTEX'保護_connection object_,它不應該在線程之間共享,因爲它使得使用事務變得不可能。 –

相關問題