ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

记一次gorm连接池打满,连接不释放的问题

2022-01-14 15:01:42  阅读:464  来源: 互联网

标签:rows tx err goroutine 连接数 连接池 打满 gorm conn


概述:使用事务一定要关闭!(心急的可以直接看这句,赶紧去检查下自己的代码)

  我们golang项目用的gorm,最近pre测试跑脚本时,总会出现504,某个接口不可用。分析了半天pprof,阻塞数量较多的goroutine,某些时候并不能看到真实问题的所在。

  出现504,通过pprof:debug/pprof/goroutine?debug=2 或者debug/pprof/goroutine?debug=1 能看到阻塞的goroutine,处在io wait状态
  检查下pod内,连接数(netstat),发现http的连接数和mysql的连接数暴增!!!
  导致mysql的连接数暴增常见的有两种:
  1、使用事务,没有关闭~!!!!! (我们小伙伴的错误命中)
    tx:=db.conn后,err判断,直接return,没有进行tx.rollback。这时候mysql的conn_pool会+1,且不可复用。
    错误的请求继续上涨后,就会出现连接数打满,继而新的请求一直阻塞,goroutine也会阻塞住
  正确使用:

conn, err := mysql.GetConn()
if err != nil {
    return
}
tx := conn.Begin()
    defer func() {
        if r := recover(); r != nil {
        tx.Rollback()
    }
}()
if err != nil {
    tx.Rollback()
    return
}        

  

2、使用rows方法请一定要关闭连接。rows请一定要在err==nil的情况下使用,不然会导致空指针panic。

rows, err := db.rows()
if err != ni {
    return err
}
defer rows.close()

 

3、使用事务,切记

tx := conn.Begin()
下面一定使用tx,不要用conn了!!!!

标签:rows,tx,err,goroutine,连接数,连接池,打满,gorm,conn
来源: https://www.cnblogs.com/already/p/15801905.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有