0

我正在使用 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,但我不知道在哪里。

谢谢。

4

1 回答 1

1

问题可能出在您使用的 Mysql Connector/J 版本上。

我遇到了同样的问题,更新到新的 Mysql Connector v5.1.15 为我解决了这个问题。v5.1.13 有一个错误,导致您看到的问题

修复错误的版本的更改日志:http: //dev.mysql.com/doc/refman/5.1/en/cj-news-5-1-14.html

谢谢

于 2011-10-25T00:21:27.420 回答