golang sql數據庫已關閉,數據庫too many connections

最近零碎學習了一點sql的連接方面的知識。在之前,要麼數據庫已關閉,要麼連接數超出最大數,糾結。

1.open後是否要close?實際上不用close,在調用的function裏,具體到db.Query後,用defer rows.Close()就行了。

2. 而QueryRow後面不需要close。

3.begin()是事務準備。var tx *sql.Tx和defer tx.Rollback()

https://www.cnblogs.com/tsiangleo/p/4483657.html 

https://segmentfault.com/a/1190000003036452

https://www.cnblogs.com/wangchaowei/p/7994022.html

也就是說Ping和Exec方法在調用完之後,會自動釋放連接。把代碼中所有不需要返回值的語句改成由Exce方法執行,go run 一下,ok,連接數終於正常了! 

        問題是解決了,總起來以後要注意一下的東西: 

  • 程序連接數據庫會有連接泄漏的情況,需要及時釋放連接 

  • Go sql包中的Query和QueryRow(@qgymje 在評論中提到,QueryRow通過調用Scan方法,會自動關閉連接的)兩個方法的連接不會自動釋放連接,只有在遍歷完結果或者調用close方法纔會關閉連接 

  • Go sql中的Ping和Exec方法在調用結束以後就會自動釋放連接 

  • 忽略了函數的某個返回值不代表這個值就不存在了,如果該返回值需要close纔會釋放資源,直接忽略了就會導致資源的泄漏。 

  • 有close方法的變量,在使用後要及時調用該方法,釋放資源

https://studygolang.com/articles/11951?fr=sidebar 

golang Mysql -- Tx

atabase/sql提供了事務處理的功能。通過Tx對象實現。db.Begin會創建tx對象,後者的Exec和Query執行事務的數據庫操作,最後在tx的Commit和Rollback中完成數據庫事務的提交和回滾,同時釋放連接。

tx事務環境中,只有一個數據庫連接,事務內的Eexc都是依次執行的,事務中也可以使用db進行查詢,但是db查詢的過程會新建連接,這個連接的操作不屬於該事務。

https://www.cnblogs.com/flash55/p/11166541.html

 

tx := db.Begin()
tx.Rollback()  // 回滾
tx.Commit()
//然後通過tx操作Exec, Query, QueryRow and Prepare 方法,流程和上面一樣。示例
tx, err := db.Begin()
stmt, err := tx.Prepare(`UPDATE student SET age=? WHERE id=?`)
_, err = stmt.Exec(18, 5)
if err != nil {
    tx.Rollback()
    panic(err)
}
err = tx.Commit()
if err != nil {
    tx.Rollback()
    panic(err)
}

 

導入
    "database/sql"
    "github.com/go-sql-driver/mysql"
類包
 
Tx,_ := connectMysql.Begin()
stm,_ := Tx.Preapare("insert into test values(?,null)")
result,_ := stm.Exec('123')
error := Tx.Commit()或者error := Tx.Rollback()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章