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

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

  我们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也会阻塞住
  正确使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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。

1
2
3
4
5
rows, err := db.rows()
if err != ni {
    return err
}
defer rows.close()

 

3、使用事务,切记

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

posted on   studyphp  阅读(2847)  评论(1编辑  收藏  举报

相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示