關於sqlite多執行緒

2021-05-23 17:02:38 字數 959 閱讀 3630

1、如果是sqlite_open_fullmutex,也就是序列化方式,則對於連線時互斥的,只有乙個連線關閉,另外乙個連線才能讀寫

2、如果是sqlite_open_nomutex,則是多執行緒模式,對於寫是互斥的,但是如果乙個連線持續寫,另外乙個連線是無法寫入的,只能是錯誤或者超時返回。不過乙個連線寫,多個連線讀,是沒問題的。windows版本模式是sqlite_open_nomutex

3、如果要多執行緒寫併發,只有乙個辦法,就是連線->寫->關閉連線,而且需要開啟超時sqlite3_busy_timeout,不過這樣效率很低,因為一條一條寫入的話,利用不上事務

4、sqlite通過事務插入效率還可以,大約就是1000條/秒

5、sqlite的資料型別操作非常靈活,可以寫入任意自定義型別

6、如果要斷電等意外也完全保證資料完整性,pragma synchronous=full,對於大資料量提交,效能和synchronous=off相差很小。

7、對於大資料量寫入,例如一次提交100mb以上的事務,設定cache_size很有必要,預設是例如:pragma cache_size=400000,有時候提交速度會成倍提公升。

8、sqlite事務的insert或者update等是很快的,但是commit是很慢的,例如提交200mb的事務,在win7+酷睿t9300+4gb記憶體+7200轉磁碟+10gb的資料庫上,commit會花費5分鐘左右,在usb3.0的上u盤上,花費大約15分鐘,在usb2.0的u盤上,1個半小時後還沒有完成(沒有等到結果,因為是ntfs格式,造成u盤寫入太頻繁,產生了壞道,嘗試了兩個u盤都是如此,格式化為exfat就沒問題)

9、對於commit意外退出,大資料量的時候,例如200mb,下次再次進入的時候,哪怕只是乙個select,為了保證資料完整性,sqlite都要經過很長時間(和commit完成時間差不多)的rollback才能返回select結果,如果自作主張刪除臨時的journal檔案,則會造成資料庫崩潰。

android關於多執行緒操作sqlite知識點

1.關於getwriteabledatabase 和getreadabledatabase 的真正作用 getwriteabledatabase 其實是相當於getreadabledatabase 的乙個子方法,getwriteabledatabase 是只能返回乙個以讀寫方式開啟的sqliteda...

SQLite 多執行緒

sqlite支援3種執行緒模式 單執行緒 這種模式下,沒有進行互斥,多執行緒使用不安全。禁用所有的mutex鎖,併發使用時會出錯。當sqlite編譯時加了sqlite threadsafe 0引數,或者在初始化sqlite前呼叫sqlite3 config sqlite config singlet...

SQLite多執行緒使用

sqlite支援3種執行緒模式 單執行緒 這種模式下,沒有進行互斥,多執行緒使用不安全。禁用所有的mutex鎖,併發使用時會出錯。當sqlite編譯時加了sqlite threadsafe 0引數,或者在初始化sqlite前呼叫sqlite3 config sqlite config singlet...