2016-07-28 134 views
1

我有一個多線程Qt應用程序,它有多個線程訪問單個數據庫。我是否需要創建單獨的QSqlDatabase連接來在每個線程中執行SELECT/INSERT/UPDATE?在多個qt線程中使用單個QSqlDatabase連接

從Qt文檔,我無法理解,如果下面的指引是阻礙上述辦法,我建議:

「的連接只能從創建它的線程中使用之間 移動連接不支持線程或創建來自 不同線程的查詢。「

我實際上已經嘗試在我的多個QThreads中使用相同的連接,並且所有工作都很好,但想要了解它是否正確。 https://www.sqlite.org/threadsafe.html

我想使用多個線程相同的連接名稱的原因:

僅供參考,我(使用Qtsql API)據我所知使用的sqlite3從內部的Qt通過 默認支持串行模式是因爲當我嘗試在多個線程上使用不同的連接到同一個數據庫並執行SELECT/INSERT/UPDATE時,我很頻繁地得到了database locked問題。但是,在多個線程中使用相同的連接時,此問題已完全消除。

請親切指導一下。

問候,

SAURABH甘地

+0

也許創建一個包裝類,有一些插槽插入/更新/刪除,並在它自己的線程 – Zaiborg

回答

2

文檔不僅僅是阻止它,它斷然指出,你不能這樣做(重點煤礦):

的連接只能是從創建它的線程內使用

因此,不,您不能使用多個線程中的一個連接。它可能會發生作用,但不能保證能夠正常工作,而且你正在調用未定義的行爲。不保證會崩潰,請注意。

您需要:

  1. 序列化在您結束訪問數據庫,或

  2. 更改連接參數,使鎖不拒絕查詢,但阻塞,直到該數據庫變得可用。我不太確定database locked「問題」是什麼:如果您實際使用多個連接,則永遠不應該看到該錯誤代碼(我認爲它是SQLITE_LOCKED)。 Sqlite 3可以很容易地從多個線程中使用,除了啓用多線程和使用單獨的連接之外,它不需要任何努力。