2015/06/11 00:03:24,228 [ERROR] [http-bio-1081-exec-4] [com.xx.sxSendSms(SmsService.java:185)] java.net.SocketTimeoutException: Read timed out
2015/06/11 00:03:24,230 [ERROR] [http-bio-1081-exec-4] com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communications link failure during rollback(). Transaction resolution unknown.
最近线上的服务老是出现这个错误,比较多的地方是在一个发送短信的地方,大体意思如下(代码不是我写的,且不论代码逻辑的好坏):
conn = MySQL.getconnect()
try{
template = conn.query()
bsuccess = http.sendSms()
conn.insert()
}catch(...){}
if (!bsuccess)
conn.rollback()
从日志分析可以看出HTTP请求超时了(链接超时60ms, 读取超时60ms),接着执行rollback,在rollback的时候出错了,一开始以为是HTTP请求超时影响的(interactive_timeout),后来查询和修改interactive_timeout,并写代码测试,发现不是interactive_timeout的问题。
后来一个一个的查看日志中的这个错误,终于发现了其他地方也有这个错误(Transaction resolution unknown.),并且这几个是在commit的时候,这函数都只有一个数据库的操作,为了将问题重现,写了如下伪代码:
con.query()
sleep(10)
conn.roolback()
在sleep期间将电脑的网断掉,果然出现的相同的错误
2015/06/17 15:14:51.476 [ERROR] [main] [com.alibaba.druid.pool.DruidDataSource.handleConnectionException(DruidDataSource.java:1193)] discard connection
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communications link failure during rollback(). Transaction resolution unknown.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1013)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
at com.mysql.jdbc.ConnectionImpl.rollback(ConnectionImpl.java:4733)
由此断定是网络不稳定造成的,至于网络为什么不稳定就的找运维和运营商解决了,至少我能肯定的是我们公司的网络经常性的出现不稳定的情况,网络环境搭建的太复杂了(多个网络出口, 自己的DNS服务,楼上的,楼下的,各个网段,各种访问控制..........),积累了好多年的修改了,需要升级改造了!