c3p0数据库连接池出现Could not get JDBC Connection An attempt by a client to checkout a Connection has timed out.

c3p0有些年头了,也曾红极一时。
但你是否遇到过,明明并发并不高,连接池最大连接数也设的挺大了,还是报无法获取新连接。

Could not get JDBC Connection An attempt by a client to checkout a Connection has timed out.


参考文章:
https://cloud.tencent.com/developer/article/2319703

https://cloud.tencent.com/developer/article/2319708

https://cloud.tencent.com/developer/article/2319709

通过上述3篇文章,可以大致了解到,c3p0的逻辑比较复杂,特别是数据连接的回收,采用异步线程Thread

Thread 我们知道,代码执行start(),调用后线程从NEW状态变为RUNNABLE状态,准备执行; 也就是说,只是告知可跑,具体什么时候跑,要看jvm心情。心情好马上就跑,心情不好,不知道要等到什么时候。

这会导致:连接池的连接都被占用,新的请求无法获取到连接(因为数据连接池一般都有最大连接数)

当新请求进来,发现当前连接全部都占用,会调用checkout方法,一般都配置了 `checkoutTimeout` 时间,等过了这个时间还未拿到连接,就抛出上述错误。

解决方案:

替换c3p0:

一般用这个数据库连接池的都是老项目,我这个还是jdk1.6的,替换方案: HikariCP-java6

```
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP-java6</artifactId>
<version>2.3.13</version>
</dependency>
```

非maven项目,参考:

1. HikariCP-java6-2.3.13.jar

2. slf4j-log4j12-1.7.20.jar

3. slf4j-api-1.7.16.jar

4. log4j-1.2.12.jar

jar包下载地址: 中央仓库

Maven Central: org.slf4j:slf4j-log4j12:1.7.20 (sonatype.com)

 

posted on 2024-10-14 14:59  tomcat and jerry  阅读(50)  评论(0编辑  收藏  举报

导航