JVM waiting分析-mysql表锁定/Druid-springboot配置
 2019-08-13 11:18:10   263   0   

本文最后更新于天前,文中介绍内容及环境可能已不适用.请谨慎参考.

智能锁项目这几天一直在测试电池电量的问题,
好几个测试人员不停的开关锁,每天就没停过。
发现一个问题,系统后台正常,但是后台所有接口无响应的情况,每次都是等一会就会自动恢复。
这个问题已经出现过有好几次,今天又发生了这个问题,于是分析了一把。
 
第一次使用了jstack, (= ̄ω ̄=)
直接找到进程pid,打印堆栈信息.
/usr/local/java/jdk1.8.0_151/bin/jstack -l 13315 >normal.log

发现很多20001,web端口的等待。

最后都是到卡在获取数据库连接上。

妥妥的应该是没有足够的数据库连接。

"http-nio-20001-exec-124" #16019 daemon prio=5 os_prio=0 tid=0x00007fd48c0fb800 nid=0x389 waiting on condition [0x00007fd45d9d7000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000841a5748> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at com.alibaba.druid.pool.DruidDataSource.takeLast(DruidDataSource.java:1682)
	at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1280)
	at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1148)
	at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4573)

"http-nio-20001-exec-122" #16017 daemon prio=5 os_prio=0 tid=0x00007fd488051800 nid=0x386 waiting on condition [0x00007fd45dbd9000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000841a5748> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at com.alibaba.druid.pool.DruidDataSource.takeLast(DruidDataSource.java:1682)
	at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1280)
	at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1148)
	at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4573)
	at com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:666)
	at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4569)
	at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1126)
	at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1118)

 

然后看项目里面的配置,才发现用了druid-spring-boot-starter.. (。・`ω´・)

但是配置里面完全没有配置,

全部是默认配置,

通过查看

xx/druid/

发现最大连接数默认配置是8. 而且之前就达到过这个数量。

 

速度把配置改掉,增加到20,后面再看看是否还会出现~

spring:
   datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: @jdbc.url@
    username: @jdbc.username@
    password: @jdbc.password@
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      # 连接池的配置信息
      maxActive: 20

 

后记0815
发现不是连接池大小的问题,还是数据库的问题。
数据库表被锁定了。其他的查询都在等待~
运维那边有每天定时备份数据库,使用的mysqldump -opt 
晚上定时备份,不知什么情况,定时任务竟然在白天也在运行。然后导致表锁定了Waiting for table metadata lock
好吧..
 
 
 
 

 2019-08-15 10:46:48 
 0

  本文基于CC BY-NC-ND 4.0 许可协议发布,作者:野生的喵喵 固定链接: 【JVM waiting分析-mysql表锁定/Druid-springboot配置】 转载请注明



发表新的评论
{{s_uid}}   , 欢迎回来.
您的称呼(*必填):
您的邮箱地址(*必填,您的邮箱地址不会公开,仅作为有回复后的消息通知手段):
您的站点地址(选填):
留言:

∑( ° △ °|||)︴

(๑•̀ㅂ•́)و✧
<( ̄) ̄)>
[]~( ̄▽ ̄)~*
( ̄ˇ ̄)
[]~( ̄▽ ̄)~*
( ̄ˇ ̄)
╮( ̄▽ ̄)╭
( ̄ε(# ̄)
(⊙ˍ⊙)
( ̄▽ ̄)~*
∑( ° △ °|||)︴

文章分类

可能喜欢 

KxのBook@Copyright 2017- All Rights Reserved
Designed and themed by 野生的喵喵   1344115   38285