V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiumuzidiao
V2EX  ›  数据库

数据库连接池设置多少合适,一个生产问题导致程序 6 个节点假死

  •  
  •   xiumuzidiao · 6 天前 · 2157 次点击

    最近公司的某个程序发生假死( java ,springboot ),导出 dump 文件后,发现 tomcat 的 200 个线程全卡在了 getConnecton()获取数据库连接上。 然后查了一下数据库的空闲连接数大概有 5000 ,没有达到 oracle 的 10000 个上限,但是其它的程序也有获取连接慢的情况。但是我的程序就卡死在获取连接上,为什么我的连接池没有返回连接呢??

    28 条回复    2024-11-26 18:41:53 +08:00
    xiumuzidiao
        1
    xiumuzidiao  
    OP
       6 天前
    并且 6 个节点全部从 eureka 掉线,迟迟获取不到连接
    cobbage
        2
    cobbage  
       6 天前 via Android
    那是库理论支持的链接吧,你的硬件能跑这么多。照你的说法你程序已经连了 5000 个(一两百我都感觉多),我这半吊子理解是你应该排查你程序为啥链接没释放掉,网络,慢 sql ,大批量导出等,还有个影响可能是其他库的事例影响。
    xiumuzidiao
        3
    xiumuzidiao  
    OP
       6 天前
    应该是其它程序实例占用了太多链接,但是不知道为什么我的程序实例一直没释放池子里的连接给别的线程用导致程序假死
    BarackLee
        4
    BarackLee  
       6 天前 via iPhone
    你这我也遇到过 不过选择重启 springboot 就恢复了也是奇怪
    akira
        5
    akira  
       6 天前
    服务器那边的 端口限制 看了没得
    xiumuzidiao
        6
    xiumuzidiao  
    OP
       6 天前
    @akira 能访问到,但是 springboot 默认的 tomcat 线程池的 200 个线程都占满了,新的请求只能在那等待着了
    night98
        7
    night98  
       6 天前
    正常一个程序能有两百连接数就已经非常够用了,你不妨把你的程序的数据库连接池配置发上来让大家看看是不是不合理,tomcat 线程池和数据库线程池不是一个东西
    cloud107202
        8
    cloud107202  
       6 天前
    hikari 的 connectionTimeout 有没有配置
    zhenjiachen
        9
    zhenjiachen  
       6 天前 via iPhone
    我感觉就是你的线程池的连接没有释放导致的吗,不要在事务里面做耗时操作,特别是慢的 http 接口,会导致连接不会放回池子里面,所以导致获取连接超时,不是数据库的问题而是代码问题。
    xiumuzidiao
        10
    xiumuzidiao  
    OP
       6 天前
    @night98 我只是说 tomcat 的线程池都被 getConnection 卡住了
    xiumuzidiao
        11
    xiumuzidiao  
    OP
       6 天前
    @cloud107202 用的是 dbcp2 ,waitTime 默认值是-1 ,无限等
    xiumuzidiao
        12
    xiumuzidiao  
    OP
       6 天前
    @zhenjiachen 我获取连接超时时间当时没设置,使得是默认值,等待无限长
    xiumuzidiao
        13
    xiumuzidiao  
    OP
       6 天前
    目前的解决方案就是换连接池,以及别的服务不要开太多的连接数
    XuHuan1025
        14
    XuHuan1025  
       6 天前
    用 datagrip 了没有 这个很猛,之前开发库提示连接数不够,查了下我一个 ip 就占了两百个链接
    xiumuzidiao
        15
    xiumuzidiao  
    OP
       5 天前
    @XuHuan1025 没有
    xiumuzidiao
        16
    xiumuzidiao  
    OP
       5 天前
    另外发现一个东西,seata (分布式事务框架)在请求结束后会 release 连接,而正常请求中的连接会 return 回数据库连接池
    yinft
        17
    yinft  
       5 天前
    不如配置发上来一起看看
    spritecn
        18
    spritecn  
       5 天前
    @xiumuzidiao 一般都建议 fastfail,偶尔一个报错总比整体持掉好
    fffq
        19
    fffq  
       5 天前
    遇到过,连接池配置问题,贴下配置
    xiumuzidiao
        20
    xiumuzidiao  
    OP
       5 天前
    @fffq 动态数据源,就配置了个数据源类是 dbcp2 ,公司的动态数据源框架(然后没有配置连接池,用的默认的)
    xiaogu2014
        21
    xiaogu2014  
       5 天前
    ```理论上应该设置一个 pod 的 max-connections.```
    然后数据库的 active connection/max connection/idle connection/query time 等等这些指标都应该作为监控来作为调整配置的决策因素。
    引申开来包括程序线程池的使用情况。
    起个项目来优化这些吧。然后推广到公司。credit 不来了吗。
    RobinzzZ
        22
    RobinzzZ  
       5 天前
    设置一个超时时间把,一直等也太傻了
    Outer2048
        23
    Outer2048  
       5 天前
    没有合适的值,如果小了就扩大一倍,直到扩到不卡
    当然扩大很多之后依然卡,问题应该不在数据库连接上
    seedhk
        24
    seedhk  
       5 天前
    遇到过类似的,是超时时间的问题,顺便再解决下慢 SQL 。不然还早还会碰到。
    liuhuan475
        25
    liuhuan475  
       5 天前
    用的什么连接池?楼上说的有道理,慢 sql 导致连接未释放,同一个 tomcat 线程配置了最大连接池数量,到了最大连接数数会阻塞获取连接池。1.排查慢 sql 。2.修改连接超时时间
    me1onsoda
        26
    me1onsoda  
       5 天前
    多大配置的数据库啊。。设置了 10000 个连接数
    xiumuzidiao
        27
    xiumuzidiao  
    OP
       5 天前
    已复现,dbcp2 的线程池里的所有连接在 idle 变成 active 失败或者去 validate 失败,idle 连接会 destroy ,然后其它线程造成死锁的现象,本地可以复现,链接: https://issues.apache.org/jira/projects/POOL/issues/POOL-407?filter=allopenissues
    FawkesV
        28
    FawkesV  
       4 天前
    我也遇到过,多线程连接池打满了。连接池配置的问题,默认 10
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1898 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 16:19 · PVG 00:19 · LAX 08:19 · JFK 11:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.