今日线上突发一个问题,应用假死,不接受http请求,排查日志,发现有大量的 The last packet successfully received from 异常。
首先排查数据库和链接池配置
destroy-method="close">
对比mysql 配置 的timeout配置
链接池的超时时间远远小于 数据库的wait_timeout ,配置没有问题
wait_timeout wait_timeout 服务器关闭非交互连接之前等待活动的秒数
数据库wait_timeout配置的3600s(1小时)、业务线程闲置状态下和数据库保持的连接存活1个小时后数据库主动断开连接,这个时候有新的数据库操作请求、拿到该连接去执行validationQuery检测连接是否有效,由于数据库已经主动断开连接、执行检测sql就会抛出上面的错误。问题的本质还是druid线程池里没有及时清除无效的数据库连接导致。
但数据库的判断认为的连接超时时间是 timeBetweenEvictionRunsMillis = 3600000 < wait_timeout = 31536000 故问题不在此
排查应用程序
使用arthas监控线程,果不其然,出现了10running的http-nio线程,打开一个查看一下,果然有线程死锁
[arthas@23223]$ thread 167
"http