私は、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;
}
}
I 100にmaxPoolSizeを増加しようとここ
は有用コードでありますこれは私のpostgresqlサーバで定義されているmaxConnectionsです。このようにして、postgresqlサーバーがクラッシュする直前に、現在43のビジー状態の接続がオープンされていることがわかりました。
おそらく私はJDBCTemplateを間違った方法で使用していますが、私はどこを知りません。
ありがとうございました。