HikariCP Свободные соединения остаются в пуле соединений как активные
Я использую 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.
Итак, что я делаю не так.? Или неправильно понял конфигурацию?
Журнал инициализации Хикари:
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 часа я попробовал несколько решений из разных веток, и ни одна из них не устранила мою проблему. Так что вот наблюдения, которые могут быть важны.
SpringBootJPAHikariCP - Reset (autoCommit) on connection org.postgresql.jdbc.PgConnection@1344bbf1
нашел этот журнал. Изучал Reset (autoCommit) по подключению в HikariCP этой ветки. пытался установитьauto commit
То же самое (верно) на обеих сторонах (спящий режим и Hikari) и также попыталось использовать false с обеих сторон. все еще не повезло.Позволяет
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
Все свободные соединения
idle
формаpostgres
точка зрения иactive
Форма Хикари точка зрения. Таким образом, когда есть 5 свободных соединений из базы данных, естьtoatal = 5, active=4, idle = ,waiting=0
в лог Хикари.
Замечания:
может быть, у меня именно эта проблема https://github.com/brettwooldridge/HikariCP/issues/109 в моем случае активное соединение увеличивается с каждой транзакцией.
HikariCP - соединение недоступно, это тоже та же проблема. но никто не дает четкого решения этой проблемы. кстати я использовал
@Transactional
с самого начала, как предложено принятым ответом.
1 ответ
Это не было проблемой Хикари, в моем конце была ошибка. Все еще публикую подробности о том, почему это произошло, если это кому-то поможет.
Я использовал 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.