我正在開發一個使用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,但我不知道在哪裏。
謝謝。