Qt中針對SQLite的併發訪問

2021-09-16 23:23:57 字數 1471 閱讀 8503

問題:sqlite是一種檔案級別的資料庫,因此他的鎖機制也是檔案級別的,只支援併發讀訪問資料庫,不支援併發寫,也不支援併發讀寫。只要有乙個執行緒進行寫操作,其他執行緒都將等待,如果同時執行讀寫操作,會返回sqlite_busy。因此對於寫操作是需要序列執行的。

解決方案:

qsqlerror::noerror     0    沒有錯誤發生

qsqlerror::connectionerror  1   (資料庫)連線錯誤

qsqlerror::statementerror  2    sql語句語法錯誤

qsqlerror::transactionerror  3    事務失敗錯誤

qsqlerror::unknownerror   4    未知錯誤

重新翻了翻qt assistant,在qsqldatabase頁的void qsqldatabase::setconnectoptions(const qstring &options = qstring())讓我找到了qsqlite_busy_timeout

文件中關於這些option的使用也提供了乙個例子:

// mysql connection

db.setconnectoptions

("ssl_key=client-key.pem;ssl_cert=client-cert.pem;ssl_ca=ca-cert.pem;client_ignore_space=1");

// use an ssl connection to the serverif(

!db.

open()

)...

// postgresql connection

db.setconnectoptions

("requiressl=1");

// enable postgresql ssl connectionsif(

!db.

open()

)...

// odbc connection

db.setconnectoptions

("sql_attr_access_mode=sql_mode_read_only;sql_attr_trace=sql_opt_trace_on");

// set odbc optionsif(

!db.

open()

)

總結:

實際應用中,並不是讓資料庫去直面大併發讀寫,會借助「外力」,比如快取、利用主從庫實現讀寫分離、分表、使用佇列寫入等方法來降低併發讀寫。特別是對於sqlite來說,相較於mysql等資料庫畢竟缺乏了許多功能(例如樂觀鎖、悲觀鎖),所以更多還是要在應用層上下功夫來處理併發。

SQLite的併發處理

使用sqlite經常會遇到併發處理,要處理好多執行緒或多程序之間的併發,就得搞清楚sqlite的機制,尤其是sqlite的鎖機制。因為sqlite是檔案資料庫,所以它的鎖也基本是和檔案一致,也即 寫獨佔,讀共享。這意味是在讀取資料庫的時候,是可以多個執行緒共享的,而如果有增刪改的操作,則會獨佔此檔案...

cocoa併發訪問Sqlite中的死鎖問題

在實際開發過程中,如果涉及到資料庫的頻繁寫入,更新等操作,在加上連續事件的有序操作,死鎖的問題就可能發生 廢話不多說了 開發中使用最多sqlite三方庫是fmdb,最新版本的fmdb為了支援併發,加入了fmdatabasequeue,其原理就是對乙個databse的訪問,通過內部的乙個serialq...

Qt中操作SQLite資料庫

sqlite是一款開源 輕量級 跨平台的資料庫,無需server,無需安裝和管理配置。它的設計目標是嵌入式的,所以很適合小型應用,也是qt應用開發種常用的一種資料庫。目錄1.驅動 2.初相遇 3.建立表 4.執行增刪改查 5.高階 6.工具 7.參考 qt sql模組使用驅動程式外掛程式 plugi...