我正在使用 Spring、JDBCTemplate 和 c3p0 开发一个具有数据库访问权限的 Web 应用程序。
我经常有服务器冻结,我很确定它来自繁忙的数据库连接数。如果我使用 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,但我不知道在哪里。
谢谢。