Knight's Blog
百度资深研发工程师,现居上海。互联网广告从业者。 擅长于大规模的系统平台服务架构。在招聘平台、社交平台、社区平台、 资源下载平台、计算机图形图像技术等领域也颇有经验。
联系方式: knightliao AT gmail.com
联系
Knight's Blog » 工作

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

2015-08-12 12:31

表现分析:

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

简单处理无法解析

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

日志分析:

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

代码分析:

http://ww3.sinaimg.cn/mw1024/006bdDhdgw1euzpe17eegj30kd01lgmj.jpg

mysql日志分析:

http://ww3.sinaimg.cn/bmiddle/006bdDhdgw1euzpjer2vpj309n02cjrz.jpg

事务开启后,再拿锁

深入分析:

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

919 次点击