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

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

golang sqlite 數(shù)據(jù)庫連接池

golang sqlite 數(shù)據(jù)庫連接池

Go
達令說 2021-08-16 16:20:35
當我在讀取數(shù)據(jù)庫的同時調(diào)用數(shù)據(jù)庫寫入時,SQLite 在我的機器中拋出一個扳手時遇到了麻煩。當不同的方法碰巧同時嘗試訪問數(shù)據(jù)庫時,就會發(fā)生這種情況。我正在做的類似于這個線程中正在做的事情,接受的答案解釋了如何使用數(shù)據(jù)庫事務來避免數(shù)據(jù)庫鎖定。這是我的一些代碼:stmt, err := dbtx.Prepare(`statement`)if err != nil {    log.Fatal(err)}_, err = stmt.Exec(values, values, values)if err != nil {            log.Fatal(err)}err = dbtx.Commit()if err != nil {    fmt.Println("database lock?")    fmt.Println(err)    dbtx.Rollback()}fmt.Println("Database storage complete!")令人困惑的是程序在輸出后存在:database lock?database is lockedDatabase storage complete!2014/09/09 18:33:11 database is lockedexit status 1我不希望我的程序因數(shù)據(jù)庫鎖定而停止,我希望它將數(shù)據(jù)存儲在內(nèi)存中并繼續(xù)其業(yè)務,直到數(shù)據(jù)庫解鎖,我可以再試一次。是否有一些標準的方法可以實現(xiàn)這一點,也許是某種隊列或數(shù)據(jù)結構,或者是否有特定于數(shù)據(jù)庫的方法來解決這個問題?為什么程序輸出后退出Database storage complete!?編輯:我相信我已經(jīng)解決了這個問題,但我不能確定。我正在使用 goroutines 和包范圍的數(shù)據(jù)庫連接。以前,我的代碼中的每個 func 在被調(diào)用時都會初始化一個數(shù)據(jù)庫連接?,F(xiàn)在,我在包的頂部定義了一個用于 DB 連接的“全局”變量,并在任何例程開始之前進行了初始化。簡而言之,代碼如下:var nDB *sql.DB稍后在主函數(shù)中...mypkg.InitDB()go mypkg.RunDatabaseOperations()mypkg.BeginHTTPWatcher(rtr)InitDB() 定義如下:func InitDB() {    fmt.Println("Init DB ...")    var err error    nDB, err = sql.Open("sqlite3", "./first.db")    if err != nil {        log.Fatal(err)    }    if nDB == nil {        log.Fatal(err)    }    fmt.Printf("nDB: %v\n", ODB)    fmt.Println("testing db connection...")    err2 := nDB.Ping()    if err2 != nil {        log.Fatalf("Error on opening database connection: %s", err2.Error())    }}因此,RunDatabaseOperations定期掃描在線資源中的數(shù)據(jù),并在發(fā)生更改時將其存儲到數(shù)據(jù)庫中(每隔幾秒一次)。BeginHTTPWatcher偵聽 HTTP 請求,因此可以從正在運行的程序中讀取數(shù)據(jù),并通過網(wǎng)絡將數(shù)據(jù)傳輸?shù)綌?shù)據(jù)的請求者,無論是本地請求還是外部請求。我還沒有遇到問題。
查看完整描述

2 回答

?
撒科打諢

TA貢獻1934條經(jīng)驗 獲得超2個贊

該文件說:

單個連接實例及其所有派生對象(準備好的語句、備份操作等)不能在沒有外部同步的情況下從多個 goroutine 同時使用。

(這是一個不同的 SQLite 驅(qū)動程序,但此限制也適用于您的。)

使用 goroutine 時,必須使用單獨的數(shù)據(jù)庫連接。

默認情況下,SQLite 在遇到被另一個事務鎖定的數(shù)據(jù)庫時會立即中止。為了允許更多的并發(fā),您可以通過設置繁忙超時來告訴它等待另一個事務完成。

使用BusyTimeout函數(shù),如果你的 SQLite 驅(qū)動有它,或者直接執(zhí)行PRAGMA busy_timeout SQL 命令。


查看完整回答
反對 回復 2021-08-16
?
幕布斯6054654

TA貢獻1876條經(jīng)驗 獲得超7個贊

請發(fā)布更多您的代碼,以便我們可以更全面地了解發(fā)生了什么。

但是,這里有一些想法。Golang 默認池數(shù)據(jù)庫連接(雖然,CENTOS 似乎可能不是......)。此外,您的程序正在“暫?!?,因為它正在等待來自數(shù)據(jù)庫連接池的打開連接。如果您希望程序的其余部分在此期間繼續(xù)運行,您應該將其作為異步函數(shù)運行 -在此處查看goroutines。這將有效地導致您的程序按照您的需要排隊,因為連接將按照它們可用時請求的順序進行分配。如果您對內(nèi)部結構感興趣,請在此處閱讀更多內(nèi)容。

如果您需要一些關于 goroutine 外觀的代碼片段,請告訴我們。


查看完整回答
反對 回復 2021-08-16
  • 2 回答
  • 0 關注
  • 458 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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