2012-06-11 261 views
0

DBCP连接池泄漏。DBCP连接池泄漏:Connection.close()不会将连接返回到池并且连接耗尽

当程序返回使用的连接时,连接资源不会返回到池中的 并已耗尽!

因此,在maxActive时间Connection.close()中,池在getConnection()时挂起。

请让我知道如何解决这个问题!

库:

公地DBCP-1.4.jar commons-pool的-1.6.jar 使用mysql-connector-java的5.1.12.jar

MySQL版本:5.5.9

来源:

import java.sql.Connection; 
import java.sql.Driver; 
import java.sql.DriverManager; 



class ConnectionManager { 

    static { 

     java.sql.DriverManager.registerDriver((java.sql.Driver) 
        Class.forName("org.apache.commons.dbcp.PoolingDriver").newInstance()) ; 
     java.sql.DriverManager.registerDriver((java.sql.Driver) 
        Class.forName("com.mysql.jdbc.Driver").newInstance()) ; 
    } 

    public Connection getConnection(String dataSourceName) { 

     return DriverManager.getConnection("jdbc:apache:commons:dbcp:/"+dataSourceName); 
    } 

} 

查询源::

String dsName = "pool" ; 

ConnectionManager pool = new ConnectionManager(); 

java.sql.Connection conn = pool.getConnection(dsName); 


conn.setAutoCommit(true); 
if(m_sql.trim().toUpperCase().startsWith("INSERT")) 
    pstmt = conn.prepareStatement(m_sql, Statement.RETURN_GENERATED_KEYS); 
else 
    pstmt = conn.prepareStatement(m_sql); 

pstmt.setFetchSize(100); 

boolean hasRS = pstmt.execute(); 

ResultSet resSet = null ; 

if (hasRS) { 
    resSet = pstmt.getResultSet(); 

} else { 
    resSet = null; 
    return ; 
} 

while(resSet.next()) { 

    //resultSet processing .... 
    :::::: 
} 


resSet.close() ; 
pstmt.close() ; 
conn.close() ; --> don't return the connection to the pool and exhaust the connection...;;; 

:::

poo.jocl ::这个位于$ CLASSPATH

<object class="org.apache.commons.dbcp.DriverManagerConnectionFactory"> 
    <string value="jdbc:mysql://localhost:3306/db?useUnicode=true&amp;traceProtocol=true&amp;characterEncoding=UTF-8"/> 
    <string value="usera"/> 
    <string value="passa"/> 
</object> 

<object class="org.apache.commons.pool.impl.GenericObjectPool"> 
    <object class="org.apache.commons.pool.PoolableObjectFactory" null="true" /> 
    <int value="100" /> <!-- maxActive --> 
      <byte value="1" /> <!-- whenExhaustedAction --> 
    <long value="10000" /> <!-- maxWait --> 
    <int value="30" /> <!-- maxIdle --> 
    <int value="3" /> <!-- minIdle --> 
    <boolean value="true" /> <!-- testOnBorrow --> 
    <boolean value="true" /> <!--testOnReturn --> 
    <long value="600000" /> <!-- timeBetweenEvictionRunsMillis --> 
    <int value="5" /> <!-- numTestsPerEvictionRun --> 
    <long value="3600000" /> <!-- minEvictableIdleTimeMillis --> 
    <boolean value="true" /> <!-- testWhileIdle --> 
</object> 

<object class="org.apache.commons.pool.KeyedObjectPoolFactory" null="true"/>  
<string null="true"/> 
<boolean value="false"/> 
<boolean value="true"/> 

回答

0

你可能不使用Apache的连接池,因为注册MySQL驱动程序。尝试删除。自从JDBC 4.0以来,您当然不需要注册MySQL驱动程序。事实上,由于所有的XML配置,我不相信你完全需要这个静态块。尝试删除它。

+0

是的,你是对的。 MySQL驱动程序不需要注册!但是,除去这个,该程序也挂起... ;;;; –

+0

我不知道为什么程序直接使用MySQL驱动程序而不是Apache连接池,尽管删除了注册MySQL驱动程序。 –

+0

Ooooops !!!。我在我的项目源中犯了一个错误... –