天天看點

golang sql資料庫已關閉,資料庫too many connectionsgolang Mysql -- Tx

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協定,轉載請附上原文出處連結和本聲明。

本文連結:https://blog.csdn.net/hotqin888/article/details/102150778

最近零碎學習了一點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()           

複制