一次故障分析:HikariPool-1 - Connection is not available

背景:

程序是基于JDK1.8x,SpringBoot2.x 开发的。连接的是Oracle 19C数据库。运行环境是通过PaaS平台,部署到云上。SpringBoot2.x 内置的就是Hakari 连接池。

故障现象:

1,压力测试时,过一段时间,应用会报告无法连接数据库库了。

hold请求之后,会抛出异常信息,关键内容是:HikariPool-1 - Connection is not available,request timed out after 954466ms.

2,另外一个特征是:基本上每隔一个小时左右,会有如下日志:HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=54s566ms151µs86ns)

故障真正原因:

持续了几天都没有解决。后来在一次debug代码的时候,发现连接池启动的时候,总报一个提示:Driver does not support get/set network timeout for connections

之前一直都有这个提示信息,由于只是一个普通的提示,而且在单元测试的时候也不影响数据库连接使用,所以一直没有当回事。

结合这个,我突然意识到,可能是数据库Driver的版本问题。查看pom文件,果然用的是jdbc6。

修改pom文件:改为:

<dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>12.2.0.1</version>
 </dependency>

或者

<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8 -->
<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>19.8.0.0</version>
</dependency>

问题解决!


正常情况下,jdbc6也能用,但是非功能压测环境下就会有问题,很坑就是。

补充一下,最近又碰到一个问题,也是oracle19C配ojdbc6驱动,查询clob字段有时候会报 org.springframework.dao.DataAccessResourceFailureException:Error attempting 驱动改成ojdbc8后也修复了

{context}