暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SpringBoot druid 踩坑笔记

coderbee笔记 2019-03-08
932

这是一个同事碰到的案例。


现象

SpringBoot 应用卡死、无反应。


处理过程

  1. 导出线程栈,发现 Tomcat 处理线程都阻塞在获取连接上,从栈上看连接池使用的是 druid。


  2. 对照 druid 源码,发现线程一直被阻塞是因为没有设置获取连接的超时时间。而从配置来看是有设置的。被阻塞的线程栈如下:

"http-nio-8006-exec-200" #7057 daemon prio=5 os_prio=0 tid=0x00007fc82c0a3800 nid=0x1b99 waiting on condition [0x00007fc7c9a57000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000c2923bd8> (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:1444)
at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1088)
at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:953)
at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4544)
at com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:661)
at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4540)
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:931)
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:923)


at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:100)
复制



  1. 通过内存 dump 发现,druid 连接池除 连接串、用户名、密码等几个属性之外的属性都是默认值。 此时连接池里总共有8个连接,都是空闲的,却没有线程能获取到连接,都在阻塞、没有被唤醒。网上查了下,应该是 druid 的bug。


  2. 再查看 druid-spring-boot-starter 源码,发现上面几个属性的前缀是 spring.datasource
    ,其他属性的前缀是 spring.datasource.druid


druid-spring-boot-starter 关于配置的举例

spring.datasource.url=
spring.datasource.username=
spring.datasource.password=


# Druid 数据源配置,继承spring.datasource.* 配置,相同则覆盖
spring.datasource.druid.initial-size=5


spring.datasource.druid.max-active=5
复制


本人负责的项目,由于使用了 Apollo,为了验证实时刷新配置,有检查每个配置项的值、且采用的 HikariCP ,未踩中这个问题。


本人负责的项目,由于使用了 Apollo,为了验证实时刷新配置,有检查每个配置项的值、且采用的 HikariCP ,未踩中这个问题。



欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论


文章转载自coderbee笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论