C3P0数据库连接池的配置问题

liudachu 2020-05-31 06:42:00
使用c3p0-config.xml进行数据库连接池的配置

这里的checkoutTimeout设置的小了就会出现异常,比如这里我设置1000会有异常,2000就可以了,
这是什么原因?
这个属性是做什么用的?
...全文
147 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿拉曼无悔 2020-05-31
  • 打赏
  • 举报
回复
试了下我这里设置为5,当超过5时会抛出异常。 你设置1000,2000都一样到了设置的秒数后会异常。但是你这里是从1-8 理论上不会有异常。那么你应该还有其他连接? 或者之前的没有释放?

public class C3P0Connection {
    public static void main(String[] args) throws PropertyVetoException {
        ComboPooledDataSource cpds = new ComboPooledDataSource();
        cpds.setDriverClass( "com.mysql.jdbc.Driver" ); //loads the jdbc driver
        cpds.setJdbcUrl( "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT" );
        cpds.setUser("root");
        cpds.setPassword("123456");
        cpds.setMaxPoolSize(5);
        cpds.setCheckoutTimeout(3000);

        for (int i = 0; i <=5 ; i++) {
            long begin =System.currentTimeMillis();
            try {
                Connection conn = cpds.getConnection();
                //conn.close();
            }catch (SQLException e){
                long end =System.currentTimeMillis();
                System.out.println("第"+i+"个连接失败,等待时间:"+(end-begin)+"ms");
            }
            long end =System.currentTimeMillis();
            System.out.println("第"+i+"个连接所用时间"+(end-begin)+"ms");

        }

    }
}

//stdout
第0个连接所用时间1970ms
第1个连接所用时间0ms
第2个连接所用时间1ms
第3个连接所用时间42ms
第4个连接所用时间0ms
DEBUG BasicResourcePool:204 - acquire test -- pool is already maxed out. [managed: 5; max: 5]
DEBUG BasicResourcePool:204 - awaitAvailable(): com.mchange.v2.c3p0.impl.NewPooledConnection@6ce6fafb
DEBUG SqlUtils:207 - Converting Throwable to SQLException...
com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResourcePool@4c583ecf -- timeout at awaitAvailable()
	at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1505)
	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)
	at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140)
	at com.zl.lennon.database.C3P0Connection.main(C3P0Connection.java:24)
第5个连接失败,等待时间:3033ms
第5个连接所用时间3033ms
liudachu 2020-05-31
  • 打赏
  • 举报
回复
引用 1 楼 阿拉曼无悔 的回复:
当配置的池耗尽时,客户端调用getonnection()时等待获取连接的毫秒数。 默认值零表示无限期等待。 设置任何正值都会导致调用getConnection()后超时,并在指定的毫秒数后抛出SQLException。拿你配置的来说,连接数超过8,下一个客户端要获取连接时在1秒后发生异常
public class C3P0_Demo {
    public static void main(String[] args) throws SQLException {
        //创建数据库连接池对象datasource
        DataSource ds=new ComboPooledDataSource("otherc3p0");
        //获取连接对象
        for (int i = 1; i <=8 ; i++) {
            Connection conn = ds.getConnection();
            System.out.println(i+":"+conn);
        }
    }
}
你说的我明白了,但是我这里设置checkedout为1000,这个测试代码,运行出现异常,什么原因?
阿拉曼无悔 2020-05-31
  • 打赏
  • 举报
回复
当配置的池耗尽时,客户端调用getonnection()时等待获取连接的毫秒数。 默认值零表示无限期等待。 设置任何正值都会导致调用getConnection()后超时,并在指定的毫秒数后抛出SQLException。拿你配置的来说,连接数超过8,下一个客户端要获取连接时在1秒后发生异常

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧