date: 2018-04-19 21:00

tag: java,mysql,exception,mat,调试,jvm

线上系统出现一个诡异的bug,通过heap dump分析

分析:

通过日志确认系统在一天前就已经停止运行

代码较简单应该不存在DB写入操作死锁

mysql操作不是特别频繁

定位:

使用jmap -dump导出线上的应用的heap dump

jstack 导出堆栈信息

分析jstack发现多个Thread在DB写入时在等待同一把锁

通过MAT分析dump

通过OQL在MAT中定位上面出现的锁住多个Thread的锁对象

通过分析发现锁对象的所有者是阿里druid线程池的com.alibaba.druid.pool.DruidDataSource

在IDE中查看DruidDataSource的源码发现几个关键属性: poolingCount, errorCount, destroyCount, lastError

google搜索lastError的描述Communications link failure, 得到可能是网络原因导致的mysql连接关闭

在MAT中查看poolingCount, errorCount, destroyCount属性的值发现与上述结论一致

重启应用,问题消失

思考:

为什么Druid线程池没有尝试重新连接?

需要优化日志,提高排查效率

增加必要的Metric和预警规则

程序假死时的heap dump:

OQL:

SELECT s.poolingCount,

s.errorCount.toString() AS errorCount,

s.destroyCount.toString() AS destroyCount,

s.createCount.toString() AS createCount,

s.lastError.exceptionMessage.toString()

FROM com.alibaba.druid.pool.DruidDataSource s

结果:

s.poolingCount |errorCount|destroyCount|createCount|s.lastError.exceptionMessage.toString()

---------------------------------------------------------------------------------------------------------------------------------------------

0 |10 |7 |17 |Communications link failure\u000a\u000aLast packet sent to the server was 180289 ms ago.

---------------------------------------------------------------------------------------------------------------------------------------------

s.connections:

结果:

Type|Name|Value

---------------

ref |[0] |null

ref |[1] |null

ref |[2] |null

ref |[3] |null

ref |[4] |null

ref |[5] |null

ref |[6] |null

ref |[7] |null

---------------

正常运行时候的core dump:

OQL:

SELECT s.poolingCount,

s.errorCount.toString() AS errorCount,

s.destroyCount.toString() AS destroyCount,

s.createCount.toString() AS createCount,

s.lastError.exceptionMessage.toString()

FROM com.alibaba.druid.pool.DruidDataSource s

结果:

s.poolingCount |errorCount|destroyCount|createCount|s.lastError.exceptionMessage.toString()

--------------------------------------------------------------------------------------------

1 |1 |0 |4 |

--------------------------------------------------------------------------------------------

s.connections:

结果:

Type|Name|Value

-------------------------------------------------------------------

ref |[0] |com.alibaba.druid.pool.DruidConnectionHolder @ 0xc5fb1958

ref |[1] |null

ref |[2] |null

ref |[3] |null

ref |[4] |null

ref |[5] |null

ref |[6] |null

ref |[7] |null

-------------------------------------------------------------------

日志文件中的异常堆栈:

org.springframework.dao.RecoverableDataAccessException:

### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 655505 ms ago.

### The error may exist in class path resource [mapper/ConfigMapper.xml]

### The error may involve com.myserver1.crawler.dao.ConfigDao.selectAllByType-Inline

### The error occurred while setting parameters

### SQL: select id, type, props, content, status, create_time, update_time from config where type = ? and status = 1

### Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 655505 ms ago.

; SQL []; Communications link failure

Last packet sent to the server was 655505 ms ago.; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 655505 ms ago.

at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:98) ~[spring-jdbc-4.3.6.RELEASE.jar!/:4.3.6.RELEASE]

at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) ~[spring-jdbc-4.3.6.RELEASE.jar!/:4.3.6.RELEASE]

at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-4.3.6.RELEASE.jar!/:4.3.6.RELEASE]

at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:74) ~[mybatis-spring-1.2.3.jar!/:1.2.3]

at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:399) ~[mybatis-spring-1.2.3.jar!/:1.2.3]

at com.sun.proxy.$Proxy60.selectList(Unknown Source) ~[?:?]

at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:205) ~[mybatis-spring-1.2.3.jar!/:1.2.3]

at com.myserver1.crawler.dao.ConfigDao.selectAllByType(ConfigDao.java:27) ~[classes!/:1.0-SNAPSHOT]

at com.myserver1.crawler.dao.ConfigDao$$FastClassBySpringCGLIB$$98d41dde.invoke() ~[classes!/:1.0-SNAPSHOT]

at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.6.RELEASE.jar!/:4.3.6.RELEASE]

at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721) ~[spring-aop-4.3.6.RELEASE.jar!/:4.3.6.RELEASE]

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.3.6.RELEASE.jar!/:4.3.6.RELEASE]

at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) ~[spring-tx-4.3.6.RELEASE.jar!/:4.3.6.RELEAS

E]

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.6.RELEASE.jar!/:4.3.6.RELEASE]

at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656) ~[spring-aop-4.3.6.RELEASE.jar!/:4.3.6.RELEASE]

at com.myserver1.crawler.dao.ConfigDao$$EnhancerBySpringCGLIB$$c890af99.selectAllByType() ~[classes!/:1.0-SNAPSHOT]

at com.myserver1.event.VideoItemListener.post(VideoItemListener.java:32) ~[classes!/:1.0-SNAPSHOT]

at com.myserver1.event.EventBus.push(EventBus.java:28) [classes!/:1.0-SNAPSHOT]

at com.myserver1.crawler.site.ABreadthCrawler.start(ABreadthCrawler.java:97) [classes!/:1.0-SNAPSHOT]

at com.myserver1.event.QueueThread.run(QueueThread.java:41) [classes!/:1.0-SNAPSHOT]

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 655505 ms ago.

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_101]

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:1.8.0_101]

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_101]

at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_101]

at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) ~[mysql-connector-java-5.1.6.jar!/:?]

at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074) ~[mysql-connector-java-5.1.6.jar!/:?]

at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3246) ~[mysql-connector-java-5.1.6.jar!/:?]

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1917) ~[mysql-connector-java-5.1.6.jar!/:?]

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060) ~[mysql-connector-java-5.1.6.jar!/:?]

at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542) ~[mysql-connector-java-5.1.6.jar!/:?]

at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734) ~[mysql-connector-java-5.1.6.jar!/:?]

at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:995) ~[mysql-connector-java-5.1.6.jar!/:?]

at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:477) ~[druid-0.2.9.jar!/:0.2.9]

at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:62) ~[mybatis-3.3.0.jar!/:3.3.0]

at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:78) ~[mybatis-3.3.0.jar!/:3.3.0]

at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62) ~[mybatis-3.3.0.jar!/:3.3.0]

at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:303) ~[mybatis-3.3.0.jar!/:3.3.0]

at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:154) ~[mybatis-3.3.0.jar!/:3.3.0]

at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:102) ~[mybatis-3.3.0.jar!/:3.3.0]

at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:82) ~[mybatis-3.3.0.jar!/:3.3.0]

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:120) ~[mybatis-3.3.0.jar!/:3.3.0]

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:113) ~[mybatis-3.3.0.jar!/:3.3.0]

at sun.reflect.GeneratedMethodAccessor81.invoke(Unknown Source) ~[?:?]

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_101]

at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_101]

at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:386) ~[mybatis-spring-1.2.3.jar!/:1.2.3]

... 15 more

Caused by: java.net.SocketException: Connection reset

at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113) ~[?:1.8.0_101]

at java.net.SocketOutputStream.write(SocketOutputStream.java:153) ~[?:1.8.0_101]

at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) ~[?:1.8.0_101]

at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140) ~[?:1.8.0_101]

at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3227) ~[mysql-connector-java-5.1.6.jar!/:?]

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1917) ~[mysql-connector-java-5.1.6.jar!/:?]

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060) ~[mysql-connector-java-5.1.6.jar!/:?]

at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542) ~[mysql-connector-java-5.1.6.jar!/:?]

at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734) ~[mysql-connector-java-5.1.6.jar!/:?]

at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:995) ~[mysql-connector-java-5.1.6.jar!/:?]

at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:477) ~[druid-0.2.9.jar!/:0.2.9]

at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:62) ~[mybatis-3.3.0.jar!/:3.3.0]

at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:78) ~[mybatis-3.3.0.jar!/:3.3.0]

at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62) ~[mybatis-3.3.0.jar!/:3.3.0]

at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:303) ~[mybatis-3.3.0.jar!/:3.3.0]

at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:154) ~[mybatis-3.3.0.jar!/:3.3.0]

at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:102) ~[mybatis-3.3.0.jar!/:3.3.0]

at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:82) ~[mybatis-3.3.0.jar!/:3.3.0]

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:120) ~[mybatis-3.3.0.jar!/:3.3.0]

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:113) ~[mybatis-3.3.0.jar!/:3.3.0]

at sun.reflect.GeneratedMethodAccessor81.invoke(Unknown Source) ~[?:?]

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_101]

mysql 频繁连接中断_记一次网络原因导致的mysql连接中断问题(druid)相关推荐

  1. 连接超时_记一次网络请求连接超时的事故

    点击上方蓝色字关注我们~前言 从HTTP请求超时.重试机制.操作系统网络等层面剖析了事故的原因,最终解决业务问题. 这里先抛两个问题: 1)你遭遇过由于网络连接或请求超时造成的生产事故吗? 2)你知道 ...

  2. mysql connection是什么_记一次MySQL出现too many connection

    今天中午的时候突然接到报警,MySQL连接数暴增..本来设置的max_conntion=6000, 这个数值连接已经够用.接到报警速度连接服务器连接mysql总是报如下错误: [mysql@local ...

  3. Ubuntu MySQL 亚马逊_亚马逊EC2 ubuntu下安装mysql远程无法连接问题o

    无法远程的原因有很多,我今天遇到的问题是通过navicat无法远程连接我在EC2上创建的实例. 1.通过命令" netstat -an|grep 3306 "检查一下3306端口对 ...

  4. 卡开启中断_上网卡顿、网络连接中断……9012年了PC上网还只靠宽带?

    今天编辑部网络瘫痪了,从早上上班开始就不断有同事抱怨网速不对.需要维修,然而,各种联系运营商.找集团网管,到下午小狮子写稿的时候依旧没用,额,似乎小狮子写稿.找资料.各种网络应用并没有受影响,把这个内 ...

  5. mysql 安装只有一半_记一次MySQL安装出现的坑爹问题。。。

    关键词:mysql安装msvcr100.dll缺失  vc++2010 : win10系统首次安装mysql,图方便下载了图形界面的安装包(5.6.4),本以为小事一桩:装一半失败.卸载清注册表.重装 ...

  6. mysql native数据同步_记一次MySQL(5.7版本)数据库的主从同步和备份

    我遇到的问题 我先后在BAT三大云服务器商购买了学生机,配置如下百度云2核/4G 阿里云1核/2G 腾讯云1核/2G 我的解决方案 由于我不知道百度云的续费规则,导致买了2核/4G的服务器之后以为像阿 ...

  7. mysql datetime 默认值_老大让我整理下公司内部MySQL使用规范,分享给大家

    作者:白程序员的自习室 链接:https://www.studytime.xin/article/mysql-internal-specifications.html 最近涉及数据库相关操作较多,公司 ...

  8. 记一次网络波动导致druid连接池无法创建新连接的BUG

    背景 项目使用了阿里druid jdbc连接池.某天环境出现网络波动,持续20分钟后,网络恢复,单服务一直无法连接数据库.重启之后正常运行 druid 版本:1.1.21 项目配置 spring.da ...

  9. mysql xp系统时间_【Mysql5.5 XP系统下载】mysql XP系统安装图解

    文件名:[Mysql5.5 XP系统下载]mysql XP系统安装图解 文件介绍: 步骤1:选择安装类型有3种安装类型:Typical(典型安装).Complete(完全安装)和Custom(定制安装 ...

最新文章

  1. Javascript基础与面向对象基础~第六讲 Javascript中的事件机制
  2. 机器之心 Synced 08月12日 20:59
  3. 论文笔记(A Neural Influence Diffusion Model for Social Recommendation)
  4. cocos2dx基础篇(26)——场景切换CCTransitionScene
  5. linux shell基础
  6. 去掉IE的图片工具条
  7. Quartz简答介绍
  8. 如何编写高效优雅 Java 程序
  9. 阿里与腾讯“智慧城市”的O2O谁更强?(分享)
  10. ubuntu下安装及设置FTP服务器!!
  11. 安装程序提示本地计算机已存在源,MSI文件安装错误码不再烦
  12. 微信小程序验证码倒计时60秒
  13. 人工智能工程化丨中小企业AI中台落地指南
  14. 学期学会的一些代码23333原创
  15. 016 799打印错误_富士施乐2420打印指定故障“016-799”是什么意思?
  16. C语言中文网的资源的使用——链接索引
  17. 阿里云邮箱发送邮件,多人多附件
  18. 腾讯云Ubuntu18.04配置OpenPCDet深度学习环境
  19. Ubuntu 18.04 LTS (Bionic Beaver) 已经发布附官网下载链接
  20. 麦咖啡跨界多芬推出泡泡拿铁、咖啡味泡泡洗护系列

热门文章

  1. pipioj 1028
  2. 某杭州女人的择偶标准
  3. 长文本口语语义理解技术系列①:段落分割实践
  4. JavaScript获取元素
  5. 儒猿秒杀季!互联网大厂的IM即时通信系统项目实战
  6. html画圆圈原理,HTML5如何划线和画圆
  7. 《Java Concurrency in Practice》之可见性(Visibility)
  8. MacBook nice软件
  9. python节日贺卡图片_节日贺卡图片制作手工
  10. 百度智能云人脸识别java_demo完整实例