Слишком много занятых соединений с использованием JDBCTemplate и c3p0 - PullRequest
0 голосов
/ 27 июля 2011

Я занимаюсь разработкой веб-приложения с доступом к базе данных с использованием Spring, JDBCTemplate и c3p0.

У меня часто зависает сервер, и я почти уверен, что это связано с количеством занятых соединений с базой данных. Если я наблюдаю за поведением приложения, используя jconsole, я вижу, что достигается maxPoolSize ComboPooledDataSource, и сервер больше не загружает страницу.

Вот полезный код:

Определение источника данных:

<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, то есть maxConnections, определенных на моем сервере postgresql. Таким образом, я мог видеть, что на данный момент открыто 43 занятых соединения, незадолго до сбоя сервера postgresql.

Возможно, я неправильно использую JDBCTemplate, но я не знаю, где.

Спасибо.

1 Ответ

1 голос
/ 25 октября 2011

Возможно, проблема в используемой вами версии 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

Спасибо

...