SQLite 多線程優(yōu)化總結(jié)

SQLite 是線程安全的,支持多線程操作。如何開啟呢?

1, PRAGMA SQLITE_THREADSAFE=2 確保同一個(gè)時(shí)間只有一個(gè)線程操作一個(gè)數(shù)據(jù)庫
2,開啟WAL模式:原來就是開啟了WAL,讀寫操作都是提交一些事物到WAL文件里面去,然后定時(shí)checkpoint提交到數(shù)據(jù)庫,當(dāng)讀取數(shù)據(jù)的時(shí)候,會(huì)在wal里面添加一個(gè)end mark,這樣讀取的時(shí)候,后面的更新和插入都和讀取沒關(guān),所以保證了讀取同步進(jìn)行,效率高。
https://blog.csdn.net/zearot/article/details/51039593,但是寫寫之間還是不能同步的!?。∪秉c(diǎn)。所以下面這個(gè)點(diǎn)

3, SQLite 提供了 Busy Retry 的方案,即發(fā)生阻塞時(shí),會(huì)觸發(fā) Busy Handler,此時(shí)可以讓線程休眠一段時(shí)間后,重新嘗試操作。重試一定次數(shù)依然失敗后,則返回 SQLITE_BUSY 錯(cuò)誤碼。它是通過文件鎖的方式去鎖住文件,SQLITE_BUSY 通過 fcntl 進(jìn)行文件鎖,防止其他進(jìn)程介入。若鎖失敗,則返回 SQLITE_BUSY。
因?yàn)樗鼪]有通知的機(jī)制,例如其他進(jìn)程用完這個(gè)數(shù)據(jù)庫發(fā)出通知,這樣SQLite_BUSY 的文件鎖就可以成功鎖住了文件,所以它才只能通過多次嘗試的方法去鎖文件

如何對SQLite 進(jìn)行優(yōu)化?

1,優(yōu)化點(diǎn)針對的是上面第3點(diǎn),由于Busy Retry的機(jī)制文件鎖沒有通知的機(jī)制,所以我們可以添加通知的機(jī)制:當(dāng)文件被鎖住沒辦法加文件鎖的時(shí)候,我們就將我們的事務(wù)加到一個(gè)FIFO的queue里面,線程通過pthread_cond_wait進(jìn)入睡眠,當(dāng)文件解鎖的時(shí)候,會(huì)通過pthread_cond_signal_thread_np 信號去喚醒這個(gè)線程,這樣線程就可以對這個(gè)文件進(jìn)行鎖住去寫文件了。

2, 開始MMAP,內(nèi)存映射,低版本sqllite沒有默認(rèn)打開。但是對WAL還是沒有進(jìn)行MMAP操作,那么怎么辦呢?可以減少WAL的刪除和重建,在checkpoint之后,修改WAL文件頭部的參數(shù),這樣SQLite 識別到WAL已經(jīng)不可用就會(huì)重新從頭開始寫入。 有了上面兩個(gè)優(yōu)化就可以大大提升了性能。

3,可以關(guān)閉內(nèi)存統(tǒng)計(jì),內(nèi)存統(tǒng)計(jì)是在全局變量里計(jì)算,所以有頻繁的加鎖解鎖操作比較耗時(shí)
sqlite3_config(SQLITE_CONFIG_MEMSTATUS, 0)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容