c3p0连接数不断增加

先说结论:一定存在没有close的connection!显式或隐式的。先排查是不是所有get的connection都显式的close了,如果没有,那么排查是不是有connection在进入方法的时候引用丢失了。

这两天使用c3p0的时候遇到个问题,connection的数量不断增加,进行几次操作之后就达到了maxSize了,然后请求不到新的connection,系统就崩溃了。

最开始的怀疑是connection没有close,于是把所有的getConnection()调用的地方都查了一遍,发现都在finally块中close()了,而且没有异常,但是为什么还是connection不断增加?

然后开始怀疑是不是connection从c3p0 checkout到数据库之后,checkin回来的时候超时了,然后设置

c3p0.unreturnedConnectionTimeout=30
c3p0.debugUnreturnedConnectionStackTraces=true

观察到确实是有connection超时了。。。。但是这进一步把我引入歧途了。。

然后怀疑mysql不释放连接。。。把mysql的wait_timeout改短。。。发现程序更一步gg了。

直到我在getConnection()方法中打印当前连接池的信息

public void getConnectionNumbers(ComboPooledDataSource dataSource) {
		PooledDataSource pds = (PooledDataSource)dataSource; 
		  if(null != pds){    
			    try {           
					System.out.println("------------c3p0连接池链接状态--------------");      
					System.out.println("c3p0连接池中 【 总共 】 连接数量:"+pds.getNumConnectionsDefaultUser());   
					System.out.println("c3p0连接池中 【  忙  】 连接数量:"+pds.getNumBusyConnectionsDefaultUser());           
					System.out.println("c3p0连接池中 【 空闲 】 连接数量:"+pds.getNumIdleConnectionsDefaultUser());           
					System.out.println("c3p0连接池中 【未关闭】 连接数量:"+pds.getNumUnclosedOrphanedConnectionsAllUsers());         
				} catch (SQLException e) {     
					 System.out.println("c3p0连接池异常!");        
				}    
			}
	}

惊人的发现:每次网页操作打印了两次c3p0连接池信息。。。。也就是说每次操作调用了两次getConnection()。。。。

然后我就发现了一个超级煞笔的错误。。。

我在查询里面这么写的:

public static ResultSet query(Connection connection, String sql, Object... objects) {
		PreparedStatement preparedStatement = null;
		ResultSet rs = null;
		try {
			connection = JdbcPoolUtils.getConnection();
			preparedStatement = connection.prepareStatement(sql);
			for(int i=0; i<objects.length;i++) {
				preparedStatement.setObject(i+1, objects[i]);
			}
			rs = preparedStatement.executeQuery();
			//JdbcPoolUtils.closeConnection(connection,preparedStatement,rs);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return rs;
	}

观察第五行。。我重新给参数的connection引用 分配了连接, 传进来的connection就丢了。。。。。。

我真是佛了。。

所以去掉第五行,问题解决。心累。。。。。

所以,如果出现了connection的数目不断增加,肯定是你的connection没有及时关闭,要么没有显示的去关,要么就犯了我这样的煞笔错误。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值