Проверьте время ожидания активного соединения в Tomcat JDBC Connection Pool - PullRequest
0 голосов
/ 21 мая 2018

У нас есть соединение с postgres базой данных, настроенной на tomcat connection pool.Проблема в том, что когда соединение становится активным, оно никогда не возвращается в режим ожидания.

Когда я запускаю микросервис, у него 0 активных соединений и 10 свободных.После одного часа работы работают 7 активных и 3 холостых.После выходных было 100 активных, оно достигло предела, и сервис не работал.

Есть ли способ настроить tomcat connection pool для проверки состояния активных соединений и если они застряли, чтобы закрыть их?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Поскольку у нас есть таймауты http внутри нашего кластера, кажется, что из-за этого происходит утечка соединения.Я исследовал и связь остается всегда активной.

Решением для меня было включить проверку оставленных соединений. Флаги

private DataSource configureDataSource(String url, String user, String password, String driverClassName){
    DataSource ds = DataSourceBuilder.create()
            .url(url)
            .username(user)
            .password(password)
            .driverClassName(driverClassName)
            .build();

    org.apache.tomcat.jdbc.pool.DataSource configuredDataSource = (org.apache.tomcat.jdbc.pool.DataSource) ds;

    // some other configurations here
    // ...

    configuredDataSource.getPoolProperties() 
           .setRemoveAbandonedTimeout(300);
    configuredDataSource.getPoolProperties()
           .setRemoveAbandoned(true);
}

@Bean(name = "qaDataSource")
public JdbcTemplate getQaJdbcTemplate()  {
    DataSource ds = configureDataSource(qaURL, qaUsername, qaPassword ,qaDriverClassName);
    return new JdbcTemplate(ds);
}

RemoveAbandoned и RemoveAbandonedTimeout означают, что если какое-либо соединение находится в активном состоянии больше значения тайм-аута, оно будетзакрыто.Если вы добавите это в свой код, убедитесь, что это время ожидания превышает максимальное время выполнения запроса для вашей службы.

0 голосов
/ 21 мая 2018

Похоже, ваше приложение имеет утечку соединения.По умолчанию hibernate c3p0 предоставляет средства для обнаружения утечек, есть два параметра для настройки:

5 true

После этого он напечатает трассировку стека для длинных активных соединений и закроет их.

Рекомендуется не использовать при высокой нагрузке.Если вы используете другой пул, найдите похожую вещь

...