最近在生产中遇到一个问题,解决起来费了一番功夫,查询了很多其他人的文章。在写出来,希望能帮助到其他人。

背景:

程序是基于JDK1.8x,SpringBoot2.x 开发的。连接的是Oracle 11G数据库。运行环境是通过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)

问题分析过程:

根据这些关键字,我检索了大量文章,各种说法都有。其中,下面这篇描述的现象是最接近的。

https://github.com/brettwooldridge/HikariCP/issues/679

还有这个:

MuleSoft Help Center

也有这篇:

Spring Boot 中使用 Hikari,给我整不会了 - 掘金

都没有解决我的问题。

因为我用的基本上都是Hikari的缺省配置。Hikari的大量配置项,都不用设置,缺省配置够用。

一开始以为是maxLifetime这个值的设置和数据库本身的设置有问题。比如前者比后者大,导致pool里面的连接都坏掉了。但是,调整了这个值还是不对。

故障真正原因:

持续了几天都没有解决。后来在一次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>

问题解决!

感想

别人遇到问题,现象可能和你一样,但原因可能是不一样的。

  

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐