1.环境
数据库连接池:druid连接池
开发语言:java
中间件:weblogic 12c
2.问题
功能描述:一个监听用于消费消息队列的数据,然后通过Spring的定时任务进行加工处理获取的消息数据。
检查系统发现数据没有加工,登录服务器,执行实时跟踪日志tail -33f nohup.out ,发现只有消费数据的日志,没有加工数据的日志输出。
3.排查
3.1 打印堆栈信息
ps -ef | grep java
jstack -l pid > jstack.log
发现线程阻塞在druidDataSource.getConnection(),连接池存在获取连接阻塞。
3.2 检查服务器到数据库连通性
telnet ip 1521
策略没发现问题。
3.3 检查连接池配置项
使用的是druid连接池,配置最小2个,最大30个,未加上连接超时时间,加上maxWait超时时间,重启服务,运行一段时间后发现会出现连接超时所设置的时间。
3.4 怀疑是连接池中保持的连接不可用
加上以下参数
timeBetweenEvictionRunsMillis
: 验证连接空闲多久后进行剔除。
minEvictableIdleTimeMillis
: 连接在池中空闲的最小时间后进行剔除
运行一段时间后发现会出现连接超时所设置的时间,与连接池连接无关。
3.5 测试获取数据库连接,怀疑是网络不稳定
登录weblogic控制台创建连接池,测试连接,不断的点击验证连接。
会出现个别连接重置
使用ssh -v -p port ip
也是进行多次验证测试,
正常的应该是有字样Connection established,而最后是Connection closed by remote host,
异常的最后输出是Connection reset by peer
3.6 寻找网络的同事排查
最终在网络同事的配合下定位到源端到目标端访问存在防火墙配置问题,加上防火墙策略后,验证不再出现该问题。
4.解决复盘
先打印出堆栈信息分析定位问题,检查连接池配置参数,再排查网络策略连通性,再验证测试获取连接是否正常。