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