天天看点

公司管理控制台突然不能访问事故原因--CP30 APPARENT DEADLOCK!!!

[size=medium] 前段时间碰到个C3P0的问题,写出来跟大家分享下。

公司运营管理控制台突然无法访问,过一小段时间可以访问,一会再次不能访问!!!

外网访问正常,数据中心的生产机不能连接上,暂时认为是网络问题导致的;

电话给数据中心,让其查明问题原因,是否机器坏了。

登录到另外一台收单生产机(负载均衡用的),能够访问,这台网络没有问题,收单正常,日志正常。查看数据库主机,查看活跃的sessoin数量下降不少,想必是另外一台(就是刚说的不能访问的一台)应用程序停掉了...

隔了20分钟,数据中心打来电话,网络恢复了!

再次登录控制台,能够访问了,查看订单处理中情况,发现从早上10点40网络的订单一直是申请中(从另外一台没有出错的机器上收取的订单,出错主机负责处理订单)但是没有处理,说明刚才出问题的机器应用程序没有自动恢复;

立即登录到出问题的机器上,查看应用程序日志,目测都是报连接池APPARENT DEADLOCK!!!定位到最初出问题时间的异常: Failed to obtain DB connection from data source '*****DS': java.sql.SQLException: Io 684976 异常: The Network Adapter could not establish the connection

分析:主要原因为网络异常,导致数据库连接池失效;当spring文件中配置了<property name="breakAfterAcquireFailure" value="true"/>,在网络没有恢复的情况下有再次尝试连接数据库时,会将该数据源申明已断开并永久关闭。

后来将配置改成<property name="breakAfterAcquireFailure" value="false"/>

为了避免上述事故的发生,最好数据中能在第一时间监控到,并恢复网络链接;但是必须考虑使应用程序有一定的自动恢复访问数据源的能力,当网络恢复时,系统能自动恢复,不需要人工重启系统最好了;

数据库监听没启动、密码或用户名输入错误、网络问题,都会导致APPARENT DEADLOCK!!!异常发生,先排除这些情况再判断是否为C3P0的Bug导致;[/size]