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
запрос проверки.