联系
Knight's Tale » 技术

业务应该避免的问题:事务+synchronized

2015-08-12 12:31

表现分析:

所有mysql连接池打满,tomcat拿不到任何mysql连接,无法接受请求。重启后系统正常。但过一段时间后又出现问题。

简单处理无法解析

我们以为连接池太少,将c3p0连接池增长10倍,仍出现连接池不够的问题。

日志分析:

  1. tomcat thread log分析:发现mysql连接池打满。
  2. mysql bin log分析:发现在开事务后,每条SQL操作相隔很久,最久长达30秒。

代码分析:

http://img2.jintiankansha.me/get5?src=http://ww3.sinaimg.cn/mw1024/006bdDhdgw1euzpe17eegj30kd01lgmj.jpg

mysql日志分析:

http://img2.jintiankansha.me/get5?src=http://ww3.sinaimg.cn/bmiddle/006bdDhdgw1euzpjer2vpj309n02cjrz.jpg

事务开启后,再拿锁

深入分析:

tomcat请求先拿mysql连接池,再拿锁,再执行接近30秒的操作,然后再释放锁。从而导致 所有请求均拿到mysql请求后,均不释放。当有新的request过来时,此时已经没有可用的mysql请求了,因此,整个系统崩溃,只能重启解决。