2011-07-27 32 views
0

我正在開發一個使用Spring,JDBCTemplate和c3p0訪問數據庫的Web應用程序。使用JDBCTemplate和c3p0的繁忙連接太多

我經常有一個服務器凍結,我很確定它來自繁忙的數據庫連接的數量。如果我使用jconsole來觀察應用程序的行爲,我可以看到已達到ComboPooledDataSource的maxPoolSize,並且服務器不再加載頁面。

這裏是有用的代碼:

數據源定義:

<Resource auth="Container" description="GDLWeb DB Connection" 
    driverClass="org.postgresql.Driver" 
    maxPoolSize="16" 
    minPoolSize="1" 
    acquireIncrement="1" 
    maxIdleTime="60" 
    maxStatements="0" 
    idleConnectionTestPeriod="1800" 
    acquireRetryAttempts="30" 
    breakAfterAcquireFailure="true" 
    name="jdbc/gdlweb" 
    user="gdlweb" 
    password="" 
    factory="org.apache.naming.factory.BeanFactory" 
    type="com.mchange.v2.c3p0.ComboPooledDataSource" 
    jdbcUrl="jdbc:postgresql://localhost:5432/postgres" 
/> 

典型接入方法(在DAO類):

protected T getPersistentObject(
     final String tableName, 
     final List<WhereClause> whereParams, 
     final RowMapper<T> rowMapper) { 

    try { 
     log.debug(this, "get " + tableName + " " + whereParams); 
     return (T) getTemplate().queryForObject(
       generateSelectStar(tableName, whereParams), 
       extractValueMap(whereParams), 
       rowMapper); 
    } catch (final EmptyResultDataAccessException e) { 
     log.warning(this, "No " + tableName + " found with " + whereParams + " in the DB!"); 
     return null; 
    } 
} 

我試圖增加maxPoolSize至100 ,這是我的postgresql服務器中定義的maxConnections。這樣,我可以看到,在postgresql服務器崩潰之前,當前有43個忙連接被打開。

我可能使用錯誤的方式使用JDBCTemplate,但我不知道在哪裏。

謝謝。

回答