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)标签:JDBC,attempt,checkout,jar,c3p0,Connection,com,连接池 From: https://www.cnblogs.com/tomcatandjerry/p/18464213