1 回答

TA貢獻1802條經驗 獲得超6個贊
我最近在 Go 中為網(wǎng)絡應用程序評估了 SQLite3 的性能,并了解到它需要一些設置才能遠程使用。
打開預寫日志
您需要使用 WAL PRAGMA journal_mode=WAL
。這就是為什么你的表現(xiàn)如此糟糕的主要原因。使用 WAL,我可以在幾秒鐘內完成 10000 次沒有事務的并發(fā)寫入。在交易中,這將是閃電般的快速。
禁用連接池
我使用mattn/go-sqlite3
它打開一個帶有SQLITE_OPEN_FULLMUTEX
標志的數(shù)據(jù)庫。這意味著每個 SQLite 調用都會被鎖保護。一切都會被序列化。這實際上就是你想要的 SQLite。在這種情況下,Go 的問題是您會收到隨機錯誤,告訴您數(shù)據(jù)庫已鎖定。原因是因為sql/DB
內部的工作方式。它內部為您管理連接池,因此它將打開多個 SQLite 連接,而您不想這樣做。為了解決這個問題,我基本上必須禁用池。打電話db.SetMaxOpenConns(1)
,它會工作。即使在具有數(shù)萬次并發(fā)讀取和寫入的非常高的負載下,它也能毫無問題地工作。
其他解決方案可能是使用SQLITE_OPEN_NOMUTEX
在多線程模式下運行 SQLite 并讓它為您管理。但是 SQLite 在多線程應用程序中并不真正起作用。讀取可以并行發(fā)生,但一次只能寫入一次。您會偶爾遇到busy
SQLite 完全正常的錯誤,但需要您對它們做些什么——當發(fā)生這種情況時,您可能不想完全停止寫入操作。這就是為什么大多數(shù)時候人們要么同步地使用 SQLite,要么通過將調用發(fā)送到一個單獨的線程來為 SQLite 工作。
- 1 回答
- 0 關注
- 470 瀏覽
添加回答
舉報