版權聲明:本文為部落客原創文章,遵循 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()
複制