记录一次gorm同事代码使用不规范导致的mysql 连接泄露。


  1. 事务开启请一定要提交或者回滚。否则就会使用一次导致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
     }
    
  1. 使用rows方法请一定要关闭连接,就跟使用http请求一样. 如下。rows请一定要在err==nil的情况下使用,不然会导致空指针panic。
    rows, err := db.rows()
    if err != ni {
    return err
    }
    defer rows.close()