Неактивные соединения HikariCP остаются в пуле соединений как активные - PullRequest
0 голосов
/ 27 мая 2018

Я использую Spring Boot (1.5.6), Hibernate, Postgres, Hikari (2.7.8).Моя конфигурация:

spring.datasource.hikari.minimumIdle=1
spring.datasource.hikari.maximumPoolSize=20
spring.datasource.hikari.idleTimeout=30000
spring.datasource.hikari.poolName=SpringBootJPAHikariCP
spring.datasource.hikari.maxLifetime=50000
spring.datasource.hikari.connectionTimeout=30000

Я ожидаю, что незанятые соединения должны быть освобождены после 30000 мс / 30 сек простоя.
Проблема в том, что при каждом запросе устанавливается новое соединение, оставляя всепростое соединение как есть.Так что через некоторое время я получаю 20 бездействующих соединений и с новым запросом Hikari пытается установить новое соединение и получить SpringBootJPAHikariCP - Connection is not available, request timed out after 30001ms.

Итак, что я делаю не так?Или неправильно понял конфигурацию?

Журнал инициализации Hikari:

SpringBootJPAHikariCP - configuration:
 allowPoolSuspension.............false
 autoCommit......................true
 catalog.........................none
 connectionInitSql...............none
 connectionTestQuery.............none
 connectionTimeout...............30000
 dataSource......................none
 dataSourceClassName.............none
 dataSourceJNDI..................none
 dataSourceProperties............{password=<masked>}
 driverClassName................."org.postgresql.Driver"
 healthCheckProperties...........{}
 healthCheckRegistry.............none
 idleTimeout.....................30000
 initializationFailFast..........true
 initializationFailTimeout.......1
 isolateInternalQueries..........false
 jdbc4ConnectionTest.............false
 jdbcUrl.........................jdbc:postgresql://localhost:5432/dbname
 leakDetectionThreshold..........0
 maxLifetime.....................50000
 maximumPoolSize.................20
 metricRegistry..................none
 metricsTrackerFactory...........none
 minimumIdle.....................1
 password........................<masked>
 poolName........................"SpringBootJPAHikariCP"
 readOnly........................false
 registerMbeans..................false
 scheduledExecutor...............none
 scheduledExecutorService........internal
 schema..........................none
 threadFactory...................internal
 transactionIsolation............default
 username........................"postgres"
 validationTimeout...............5000

Обновление: За последние 24 часа я пробовал несколько решений из разных потоков, но ни одно из нихисправил мою проблему.Так что вот наблюдения, которые могут быть важны.

  1. SpringBootJPAHikariCP - Reset (autoCommit) on connection org.postgresql.jdbc.PgConnection@1344bbf1 нашел этот журнал.изучил Reset (autoCommit) по подключению в HikariCP этой теме.попытался установить auto commit одинаковый (true) с обеих сторон (hibernate и Hikari) и попытался с false с обеих сторон.все еще не повезло.
  2. Включает leakDetectionThreshold, получено исключение обнаружения утечки.Поэтому попытался понять, если диспетчер транзакций hibernate / spring освобождает соединения.Снизу Logs это выглядит как спящий режим, работающий нормально.

    28 22:19:35- DEBUG - o.s.orm.jpa.JpaTransactionManager-371 ::  Opened new EntityManager [org.hibernate.jpa.internal.EntityManagerImpl@4212be39] for JPA transaction
    28 22:19:35- DEBUG - o.h.e.t.internal.TransactionImpl-51 ::  begin
    28 22:19:35- DEBUG - o.s.orm.jpa.JpaTransactionManager-403 ::  Exposing JPA transaction as JDBC transaction [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@243e942]
    2com.someentity.MyEntity#ac918eed-345f-4a6c-8539-fe14e7fc41e2
    28 22:19:35- DEBUG - o.h.r.j.i.LogicalConnectionManagedImpl-137 ::  Initiating JDBC connection release from afterTransaction
    28 22:19:35- DEBUG - c.zaxxer.hikari.pool.ProxyConnection-242 ::  SpringBootJPAHikariCP - Executed rollback on connection org.postgresql.jdbc.PgConnection@1344bbf1 due to dirty commit state on close().
    28 22:19:35- DEBUG - o.h.e.i.AbstractFlushingEventListener-132 ::  Processing flush-time cascades
    28 22:19:35- DEBUG - o.h.e.i.AbstractFlushingEventListener-174 ::  Dirty checking collections
    
    28 22:19:35- DEBUG - org.hibernate.internal.SessionImpl-508 ::  Disconnecting session
    28 22:19:35- DEBUG - o.s.orm.jpa.JpaTransactionManager-759 ::  Initiating transaction commit
    28 22:19:35- DEBUG - o.s.orm.jpa.JpaTransactionManager-512 ::  Committing JPA transaction on EntityManager [org.hibernate.jpa.internal.EntityManagerImpl@4212be39]
    28 22:19:35- DEBUG - o.h.e.t.internal.TransactionImpl-62 ::  committing
    28 22:19:35- DEBUG - o.h.r.j.i.LogicalConnectionManagedImpl-137 ::  Initiating JDBC connection release from afterTransaction
    28 22:19:35- DEBUG - o.h.r.j.i.LogicalConnectionManagedImpl-137 ::  Initiating JDBC connection release from afterTransaction
    28 22:19:35- DEBUG - o.s.orm.jpa.JpaTransactionManager-600 ::  Closing JPA EntityManager [org.hibernate.jpa.internal.EntityManagerImpl@4212be39] after transaction
    28 22:19:35- DEBUG - o.s.o.jpa.EntityManagerFactoryUtils-435 ::  Closing JPA EntityManager
    
  3. Все незанятые соединения имеют idle форму postgres точку зрения и active форму точки зрения Хикари.Поэтому при наличии 5 незанятых соединений из базы данных в журнале Hikari toatal = 5, active=4, idle = ,waiting=0.

Примечание:

  1. возможно, у меня именно эта проблема https://github.com/brettwooldridge/HikariCP/issues/109 в моем случае активное соединение увеличивается с каждой транзакцией.

  2. HikariCP - соединение недоступно этотоже та же проблема.но никто не дает четкого решения этой проблемы.Кстати, я использовал @Transactional с самого начала, как предложено принятым ответом.

1 Ответ

0 голосов
/ 30 октября 2018

Это не было проблемой Хикари, в моем конце была ошибка.Все еще публикую подробности того, как это произошло, на случай, если это кому-нибудь поможет.

Я использовал spring boot 1.5.6 (Это была последняя версия, когда я начал работать).Эта версия включена spring-orm 4.3.1.Эта версия spring-orm включала поддержку трех версий hibernate, Hibernate5, Hibernate4 и Hibernate3.

. Поэтому я настроил пружинную загрузку с конфигурацией сильфона для current_session_context_class.

spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext

Все работало нормально, пока не дошло до управления подключениями Hikari.spring-boot-starter-jpa для 1.5.6 включено Hibernate5 (я имею в виду ядро ​​гибернации).

Итак, после выполнения любой операции с БД пружина теряет контроль над этим соединением (большая вероятность для этой версии не соответствует).Отсюда проблема.

После изменения

org.springframework.orm.hibernate4.SpringSessionContext

на

org.springframework.orm.hibernate5.SpringSessionContext

проблема была решена немедленно.

Моя текущая конфигурация

spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL95Dialect

К вашему сведению, после решения проблемы переключается на Spring Boot 2.

...