SQLite使用日誌

2021-04-20 12:27:02 字數 1007 閱讀 1532

最近又測試了一下記憶體資料庫sqlite,發現功能增強了好多,比如多執行緒支援(用檔案鎖的方式實現的),並且也可以全記憶體化(用":memory:"的方式開啟即可)了。

由於多執行緒的支援是通過作業系統檔案鎖的方式實現的,所以當以全記憶體資料庫(即無磁碟檔案)的方式開啟sqlite時,就不支援多執行緒了,必須自行實現讀寫鎖以互斥,推薦使用ace讀寫鎖。

由於sqlite的鎖是檔案鎖的方式實現,所以它不能實現表級鎖,而只能是全資料庫檔案鎖。另外,執行緒間不能以共享資料庫指標的方式實現共享,而要分別開啟乙個sqlite例項,互斥機制才能正確的工作。所以,如果你使用":memory:"的方式開啟sqlite,不同執行緒之間很難共享乙個資料庫(每乙個執行緒都開啟了乙個全新的例項),如果你簡單的通過指標來共享,又會造成互斥機制不能正常工作,這個矛盾我還沒有找到解決辦法。

經過測試,發現sqlite和自己實現的資料結構(比如stl)的效能還是有一定差距,比如我遍歷乙個query的結果集的時間通常在幾十毫秒(時間主要和記錄集大小有關,幾十毫秒是幾十到幾百條記錄的結果),不過考慮到方便的儲存和實現索引﹑事務等功能,這個開銷還是值得的。

使用時注意如果你要使用顯示事務(預設的dml語句操作使用autocommit模式),要自行控制重試,而不能像一般的網路資料庫那樣,由資料庫連線進行阻塞等待,sqlite在你申請事務時會直接返回,不管成功與否;但你可以用下面的方法自行控制:

int iret;

do while(iret == sqlite_busy);

測試時,我用到了幾個codeproject**上發表的封裝類:

1)odbc的封裝類codbcdatabase,codbcrecordset

2)sqlite的封裝類cppsqlite

3)物件池的封裝類poolmgr

這些類都是比較好的封裝類,可以輕易地整合進自己的應用。我還特地實現了幾個直接通過odbc把網路資料庫的內容轉到sqlite的通用函式,這樣,可以輕易地進行本地應用的資料初始化(特別當這些初始資料來自於網路資料庫時),還可以用幾句話就為這些資料建立合適的索引,起到真正的記憶體資料庫的作用。

顯示 SQLite 日誌

通過在 logcat 檢視 sql 執行語句可以幫助你除錯 sqlite 問題,使用 adb shell 執行如下命令即可在 logcat 輸出 sql 執行日誌 adb shell setprop log.tag.sqlitelog v adb shell setprop log.tag.sqli...

SQLite 預寫式日誌

sqlite在3.7.0版本引入了wal write ahead logging wal的全稱是write ahead logging,它是很多資料庫中用於實現原子事務的一種機制,引入wal機制之前,sqlite使用rollback journal機制實現原子事務。rollback journal機...

SQLite 使用總結

跟mysql是有所區別的,自己用了幾天,總結如下 1 不能用mysql的分號 如 select count as count from ken content 而應該用自己打上去的分號 如 select count as count from ken content 2 主鍵一定要用 integer...