记录一次gorm同事代码使用不规范导致的mysql 连接泄露。
-
事务开启请一定要提交或者回滚。否则就会使用一次导致mysql连接加1。
如下:
db.Begin()
请一定要接受返回值并提交或者回滚事务。
如果是使用gorm老版本的每次return后都需要回滚这种情况,可以参考新版本的闭包封装提交。
就算是panic也一定能够保证回滚事务。如下:
func (db *DB)Transaction(fc func(tx DB) error,opts ...sql.TxOptions){
tx := db.Begin(opts...)
defer func() {
// Make sure to rollback when panic, Block error or Commit error
if panicked || err != nil {
tx.Rollback()
}
}()if err = tx.Error; err == nil { err = fc(tx) } if err == nil { err = tx.Commit().Error }
- 使用rows方法请一定要关闭连接,就跟使用http请求一样. 如下。rows请一定要在err==nil的情况下使用,不然会导致空指针panic。
rows, err := db.rows()
if err != ni {
return err
}
defer rows.close()