使用C3P0连接池时TimeoutException的解决方法

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 使用C3P0连接池时TimeoutException的解决方法

使用C3P0连接池时报TimeoutException错的解决方法


最近在跟着黑马程序员的Java就业班教程学习数据库连接池的配置和使用时,遇到了一个棘手的问题,就是在使用C3P0连接池连接本机的lzm数据库时无法获取连接,测试代码如下:

C3P0Demo1.java


package cn.itcast.datasource.c3p0;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class C3P0Demo1 {
    public static void main(String[] args) throws SQLException {
        //1.创建数据库连接池对象
        DataSource dataSource =new ComboPooledDataSource();
        //2.获取连接对象
        Connection connection=dataSource.getConnection();
        //3.打印
        System.out.println(connection);
    }
}

c3p0-config.xml配置信息如下:

<?xml version="1.0" encoding="utf-8"?>
<c3p0-config>
  <default-config>
    <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/lzm</property>
    <property name="user">root</property>
    <property name="password">root</property>
    <!--连接池参数-->
    <!--初始申请的连接数量 -->
    <property name="initialPoolSize">5</property>
    <!--最大的连接数量-->
    <property name="maxPoolSize">10</property>
    <!--超时时间-->
    <property name="checkoutTimeout">3000</property>
  </default-config>
  <named-config name="otherc3p0">
    <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/lzm</property>
    <property name="user">root</property>
    <property name="password">root</property>
    <!--连接池参数-->
    <!--初始申请的连接数量 -->
    <property name="initialPoolSize">5</property>
    <!--最大的连接数量-->
    <property name="maxPoolSize">10</property>
    <!--超时时间-->
    <property name="checkoutTimeout">3000</property>
  </named-config>
</c3p0-config>

IDEA报了以下错误:

Exception in thread "main" java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
  at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118)
  at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:77)
  at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:690)
  at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140)
  at cn.itcast.datasource.c3p0.C3P0Demo1.main(C3P0Demo1.java:14)
Caused by: com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResourcePool@19bb089b -- timeout at awaitAvailable()
  at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1467)
  at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:644)
  at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:554)
  at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:758)
  at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:685)
  ... 2 more


在各种网站上都搜索不到解决的方法,在即将陷入绝望时,突发灵感,检查开发环境

我的开发环境是 Java8+MySQL5.7,使用的Jar包是mysql-connector-java-8.0.17.jar,c3p0-0.9.5.2.jar,mchange-commons-java-0.2.12.jar


20190827110445943.png


而视频教程中使用的数据库驱动包是mysql-connector-java-5.1.48.jar,于是我将libs目录下的mysql-connector-java-8.0.17.jar删除,导入mysql-connector-java-5.1.48.jar


把c3p0-config.xml配置信息中的<property name="driverClass">com.mysql.cj.jdbc.Driver</property>代码都修改成<property name="driverClass">com.mysql.jdbc.Driver</property>


再次运行C3P0Demo1.java后,问题解决,控制台打印的消息如下:


2019082711152010.png


问题解决!原来这个问题的根本原因是mysql-connector-java-8.0.17.jar与c3p0-0.9.5.2.jar,mchange-commons-java-0.2.12.jar这两个包不匹配或不兼容所导致的,像mysql-connector-java-8.0.17.jar是最新版的Jar包,c3p0-0.9.5.2.jar,mchange-commons-java-0.2.12.jar是较老的Jar包,显然会出现不能适配的情况了,所以开发不做最新版,这句话还是很有道理的啦!


总结


解决的这个问题给了我一个很大的警示,就是在做Java开发的过程中选择正确的开发环境很重要,一定要选择好版本相匹配的开发环境和Jar包,配置合适的文件信息,才能让程序正常地运行,才不会产生让人焦头烂额的各种异常信息。今后,要引以为戒!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
Kam
|
druid
druid数据连接池异常 connection holder is null 解决方案
druid数据连接池异常 connection holder is null 解决方案
Kam
2224 0
|
3月前
|
Java Apache
httpclient能不能改成长连接的连接池
【8月更文挑战第25天】httpclient能不能改成长连接的连接池
111 2
|
4月前
|
Java Redis 数据安全/隐私保护
Redis14----Redis的java客户端-jedis的连接池,jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,最好用jedis连接池代替jedis,配置端口,密码
Redis14----Redis的java客户端-jedis的连接池,jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,最好用jedis连接池代替jedis,配置端口,密码
|
5月前
|
网络安全 Nacos
对于修改后Nacos端口,连接超时,java.util.concurrent.TimeoutException: Waited 3000 milliseconds (plus 5 millisec
对于修改后Nacos端口,连接超时,java.util.concurrent.TimeoutException: Waited 3000 milliseconds (plus 5 millisec
|
NoSQL Java 测试技术
Springboot2.x集成lettuce连接redis集群报超时异常Command timed out after 6 second(s)
最近在对一新开发Springboot系统做压测,发现刚开始压测时,可以正常对redis集群进行数据存取,但是暂停几分钟后,接着继续用jmeter进行压测时,发现redis就开始突然疯狂爆出异常提示:Command timed out after 6 second(s)......
384 0
|
SQL 缓存 关系型数据库
连接池设置
连接池设置
105 0
|
运维 监控 负载均衡
HttpClient连接池设置引发的一次雪崩
HttpClient连接池设置引发的一次雪崩
|
Java 关系型数据库 MySQL
JDBC的超时问题
JDBC的超时问题
441 0
|
XML SQL Java
c3p0连接池的用法
使用DButils进行连接并对数据库进行操作
1044 1
c3p0连接池的用法
|
监控 网络协议 druid
连接池配置你真的会吗?
连接池配置你真的会吗?
379 0