C3P0连接池泄露,C3p0报错

本文详细解析了在使用C3P0作为数据源时,出现连接池溢出导致的连接获取失败问题的原因及解决方法。通过分析连接关闭机制,指出手动获取连接未关闭、事务未提交等情况可能导致的问题,并提供了调试方法和解决方案,如优化SQL、使用特定事务传播行为、手动关闭连接等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做项目的时候,项目运行一段时间后 出现 :An attempt by a client to checkout a Connection has timed out. 这个是因为连接池用光,无法获取连接了,


使用C3P0作为数据源的时候,经常出现连接池不够,不能获取连接 An attempt by a client to checkout a Connection has timed out. 

出现这种情况绝对出现在连接没关闭,在什么下没关闭呢?

1:如果你手动从c3p0连接词获取连接,检查下有没有地方遗漏了忘记关闭

2:事务没提交,在某些地方使用了事务,事务挂起没提交,连接就不会关闭

     我们项目就出现这个情况,使用Spring来管理事务的,因为一个方法里会调用多个方法,Spring事务就会等这些全部方法执行完后才会关闭连接,但是如果这个方法里有个循环,重复查询数据,一个SQL就会产生一个链接 那么连接池就会挂掉 

  调试方法可以在每个方法执行前后,输出当前连接池的使用情况,来监听

//首先注入C3p0的数据源

@Resource
ComboPooledDataSource cpds;

//添加一个方法
private void printC3p0Log() {
        try {
            System.out.println("---链接总数量" + cpds.getNumConnections() + "使用中的链接" + cpds.getNumBusyConnections() + "空闲的链接" + cpds.getNumIdleConnectionsAllUsers());
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

    然后再每个SQL执行前后输出下,这样你回看到连接池数量暴增加(如果是在Spring事务管理,并且在一个方法)


解决方法:

    1:如果SQL执行较长,优化他,或使用存储过程

    2:强暴一点在方法上添加  @Transactional(propagation= Propagation.NOT_SUPPORTED) 或在读的方法上设置readOnly = true 

3: 把这个方法分解成很多小方法,在各个方法上添加2 中的注解;    

4:从DataSource中获取数据源(datasource.getConnection ,注意要手动提交,归还connection)





转载于:https://my.oschina.net/emmet/blog/291650

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值