第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Sqlite并發(fā)寫入性能

Sqlite并發(fā)寫入性能

Go
qq_花開花謝_0 2021-12-20 14:47:10
我正在用 Golang 和 Sqlite3 編寫一個網(wǎng)站,我預計每天有幾分鐘的時間每秒大約有 1000 次并發(fā)寫作,所以我做了以下測試(忽略錯誤檢查以看起來更干凈):t1 := time.Now()tx, _ := db.Begin()stmt, _ := tx.Prepare("insert into foo(stuff) values(?)")defer stmt.Close()for i := 0; i < 1000; i++ {    _, _ = stmt.Exec(strconv.Itoa(i) + " - ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,./;'[]-=<>?:()*&^%$#@!~`")}tx.Commit()t2 := time.Now()log.Println("Writing time: ", t2.Sub(t1))寫入時間約為0.1秒。然后我將循環(huán)修改為:for i := 0; i < 1000; i++ {    go func(stmt *sql.Stmt, i int) {        _, err = stmt.Exec(strconv.Itoa(i) + " - ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,./;'[]-=<>?:()*&^%$#@!~`")        if err != nil {            log.Fatal(err)        }    }(stmt, i)}這給了我神圣的 46.2 秒!我運行了很多次,每次都超過 40 秒!有時甚至超過一分鐘!由于 Golang 并發(fā)處理每個用戶,是否意味著我必須切換數(shù)據(jù)庫才能使網(wǎng)頁正常工作?謝謝!
查看完整描述

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ā)生,但一次只能寫入一次。您會偶爾遇到busySQLite 完全正常的錯誤,但需要您對它們做些什么——當發(fā)生這種情況時,您可能不想完全停止寫入操作。這就是為什么大多數(shù)時候人們要么同步地使用 SQLite,要么通過將調用發(fā)送到一個單獨的線程來為 SQLite 工作。


查看完整回答
反對 回復 2021-12-20
  • 1 回答
  • 0 關注
  • 470 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號