最近,我在生产中遇到了一个问题。我花了很多时间来解决它,并询问了很多其他人的文章。写下来,我希望能帮助别人。
背景:
程序是基于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>
问题解决!
感想
当别人遇到问题时,现象可能和你一样,但原因可能不同。