共勉
"诸君离学校而去了。在社会上立身的困难,恐怕比在学校里求学还要加甚。若非立志奋斗,则以前所受的教育,反足以增加人生的苦恼,或转为堕落的工具。这是诸君所当特别注意的。事业的成功,须经过长时间的辛苦艰难——成功的代价,走过了许多荆棘的路,方才能寻获康庄大道。立志是砍荆棘斧斤,奋斗是劳力。万不可希望以最少的劳力,获最大的成功。" -- 蒋梦麟
Knight's Blog
滴滴海浪技术主管, 前百度资深研发工程师,现居上海。 擅长于大规模的系统平台服务架构。在

- 亿级别搜索平台(sov5.cn)
- 大规模分布式爬虫
- 中间件架设(disconf,CanalX)
- 广告平台(百度联盟广告)
- 租车平台(滴滴租车)
- 语言招聘平台(51tra.com)
- 内容平台(100weidu.com)
- 社区平台(python88.com)
- 资源下载平台(misou.com)
- 计算机图形图像技术(一篇一作)
- 机器学习(一篇一作)

等领域具有颇有经验。
联系方式: 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请求了,因此,整个系统崩溃,只能重启解决。

1711 次点击