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

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

我真是佛了。。

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

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

你可能感兴趣的:(学习)