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.scan 扫描如果用的for rows.next(){}, 也一定要在最后调用rows.Err()看有没有错误,因为mysql连接断开也会导致 for 循环退出,此时有可能只扫描到一部分数据或者根本没扫描到数据。
rows, err := db.rows()
if err != ni {
return err
}
defer rows.close()
// rows.scan 扫描
err := rows.Err()
if err != ni {
return err
}