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.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
}

posted on 2021-12-30 09:35  biwentao  阅读(750)  评论(0编辑  收藏  举报

导航