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

举报· 1443 次点击
登录 注册 站外分享
13 条回复  
xiumuzidiao 楼主 初学 昨天 16:25
并且 6 个节点全部从 eureka 掉线,迟迟获取不到连接
cobbage 小成 昨天 16:51
那是库理论支持的链接吧,你的硬件能跑这么多。照你的说法你程序已经连了 5000 个(一两百我都感觉多),我这半吊子理解是你应该排查你程序为啥链接没释放掉,网络,慢 sql ,大批量导出等,还有个影响可能是其他库的事例影响。
xiumuzidiao 楼主 初学 昨天 17:39
应该是其它程序实例占用了太多链接,但是不知道为什么我的程序实例一直没释放池子里的连接给别的线程用导致程序假死
BarackLee 小成 昨天 17:42
你这我也遇到过 不过选择重启 springboot 就恢复了也是奇怪
akira 初学 昨天 17:44
服务器那边的 端口限制 看了没得
xiumuzidiao 楼主 初学 昨天 18:08
@akira 能访问到,但是 springboot 默认的 tomcat 线程池的 200 个线程都占满了,新的请求只能在那等待着了
night98 小成 昨天 18:52
正常一个程序能有两百连接数就已经非常够用了,你不妨把你的程序的数据库连接池配置发上来让大家看看是不是不合理,tomcat 线程池和数据库线程池不是一个东西
cloud107202 小成 昨天 20:47
hikari 的 connectionTimeout 有没有配置
zhenjiachen 小成 昨天 21:21
我感觉就是你的线程池的连接没有释放导致的吗,不要在事务里面做耗时操作,特别是慢的 http 接口,会导致连接不会放回池子里面,所以导致获取连接超时,不是数据库的问题而是代码问题。
12下一页
返回顶部