Tomcat JDBC пула с весны

Я получаю это предупреждение:

WARNING:[PoolCleaner[661646649:1440675349770]] org.apache.tomcat.jdbc.pool.ConnectionPool.abandon 
Connection has been abandoned PooledConnection[org.postgresql.jdbc4.Jdbc4Connection@7c9e8e2e]:
java.lang.Exception

Для приложения я использую Spring Framework с пулами Tomcat JDBC и Postgres в качестве базы данных. Мой конфигурационный файл:

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://ip/db" />
        <property name="username" value="user" />
        <property name="password" value="pass" />
        <property name="initialSize" value="5" />
        <property name="maxActive" value="10" />
        <property name="maxIdle" value="10" />
        <property name="testOnBorrow" value="true" />
        <property name="validationInterval" value="30000" />
        <property name="minIdle" value="5" />
        <property name="removeAbandoned" value="true" />
        <property name="removeAbandonedTimeout" value="60" />
        <property name="logAbandoned" value="true" />
        <property name="validationQuery" value="SELECT 1" />
        <property name="initSQL" value="SET application_name = 'app'" />
    </bean>

Здесь проблема. Из моего понимания removeAbandoned следует отключать только те соединения, которые используются более 60 секунд, то есть запросы, которые выполняются более 60 секунд. У меня нет таких запросов вообще. Но мои связи из пула заброшены.

Я подозреваю что removeAbandoned удаляет пустые соединения в пуле. Хотя это не должно быть. В моем приложении я получаю соединение следующим образом:

//i am using autowiring.
@Autowired
private DataSource dataSource; 
//and in my methods i use it this way: 
Connection conn = dataSource.getConnection();
//and i am closing it after method completion
//maybe i should not??
conn.close()

ОБНОВЛЕНИЕ: я нашел ошибку. Моя переменная подключения была глобальной, я сделал ее локальной для метода, и все получилось. Также протестирован Apache, используется пул. (соединения обновлены, видно по pg_stat_activity). Спасибо за ответы.

1 ответ

Если соединение не используется во время X секунд (тайм-аут) и не возвращается в пул, считается, что он был оставлен, то есть неправильный код оставил соединение открытым (или, скорее, не вернул его в пул).

Свободные соединения не отменяются (или, по крайней мере, они не должны быть), так как они не используются.

Это либо ошибка в пуле соединений (маловероятно для такой стандартной функциональности), либо где-то соединение используется неправильно. Это может быть не очевидно.

Вы также можете контролировать соединения со стороны Postgres, с select * FROM pg_stat_activity;, Вы должны хорошо видеть тех, которые ждут в бассейне, так как они показывают SELECT 1 запрос проверки.

Другие вопросы по тегам