美文网首页
druid连接池长时间未操作oracle引发的坑

druid连接池长时间未操作oracle引发的坑

作者: 不二不二熊 | 来源:发表于2019-09-28 22:15 被阅读0次
一、概要

springBoot整合druid配置多数据源,因为业务原因,A数据源在很长一段时间内都没有进行CRUD等任何相关操作;当一段时间后,对数据库进行操作时,发生假死现象,具体表现为,进程卡在数据库操作前一步。整个项目无任何报错以及异常,在长时间阻塞,最终引发超时异常。

二、问题版本以及配置
      <!--连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
    </dependencies>
spring.datasource.dynamic.druid.initial-size=5
spring.datasource.dynamic.druid.min-idle=5
spring.datasource.dynamic.druid.maxActive=20
spring.datasource.dynamic.druid.maxWait=60000
spring.datasource.dynamic.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.dynamic.druid.minEvictableIdleTimeMillis=60000
spring.datasource.dynamic.druid.validationQuery=SELECT 1 FROM DUAL
spring.datasource.dynamic.druid.validation-query-timeout=60000
spring.datasource.dynamic.druid.testWhileIdle=true
spring.datasource.dynamic.druid.poolPreparedStatements=true
spring.datasource.dynamic.druid.maxPoolPreparedStatementPerConnectionSize=20
三、问题以及解决

其实当时这是个数据抽取的服务,单纯是三个定时任务,从B数据库抽取到A数据库。问题发生后,首先考虑是不是异常引发的,然而就算我将整段代码try-catch后仍然没有捕获异常;其次考虑是不是JVM引发的,开了jvm监控工具,发现垃圾回收十分正常,也并没有死锁之类的;同时也有考虑是不是同步定时任务问题,后来改成全异步仍然没有解决掉;最后打印了即将入库的数据,并没有发现异常。其中,有考虑国或许是连接池问题,使用druid监控工具查看,没有发现连接泄露之类的,所以后面折腾了很久。最后跑到druid GitHub上,发现issue很多人都提到druid重新尝试获取连接时会卡死,所以得知这并不是我个人问题。
最后的折中解决办法是:隔一段时间自主获取连接,3min或者5min之类的,注意时间不要太长。

相关文章

网友评论

      本文标题:druid连接池长时间未操作oracle引发的坑

      本文链接:https://www.haomeiwen.com/subject/tvfouctx.html