Я использую 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 часа я пробовал несколько решений из разных потоков, и ни одно из них не устранило мою проблему. Итак, вот наблюдения, которые могут быть важны.
SpringBootJPAHikariCP - Reset (autoCommit) on connection org.postgresql.jdbc.PgConnection@1344bbf1 нашел этот журнал. учился
Сброс (autoCommit) при подключении в HikariCP этот поток. пытался установить auto commit одинаково (true) на обеих сторонах (спящий режим и Hikari) и также пытался с false на обеих сторонах. все равно не повезло.Включает leakDetectionThreshold, получено исключение обнаружения утечки. Итак, попытался понять, освобождает ли диспетчер транзакций hibernate / spring соединения. Из журналов ниже похоже, что спящий режим работает нормально.
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 с точки зрения Hikari. Итак, когда есть 5 незанятых соединений с базой данных, в журнале Hikari есть toatal = 5, active=4, idle = ,waiting=0.
Примечание:
может быть, у меня именно эта проблема https://github.com/brettwooldridge/HikariCP/issues/109 в моем случае активное соединение увеличивается с каждой транзакцией.
HikariCP - подключение недоступно, это тоже такая же проблема. но никто не предлагает четкого решения этого вопроса. Кстати, я использовал @Transactional с самого начала, как это было предложено в принятом ответе.
как мне тогда решить эту проблему. любые предложения или ресурсы для чтения.? Кстати, я новичок в вопросе пула соединений.
Включите leakDetectionThreshold и просмотрите журнал на предмет трассировки стека утечек.
после включения leakDetectionThreshold получил несколько исключений обнаружения утечек. так что, возможно, это не сам пул, может быть, мое приложение делает что-то не так. все еще открыт для предложений
@brettw, пожалуйста, проверьте мои обновления по этому вопросу. все еще застрял в проблеме.
Ваша конфигурация постоянно открывает и закрывает EntityManager? Ваш журнал подразумевает, что это так, например. Opened new EntityManager [org.hibernate.jpa.internal.EntityManagerImpl@4212be39] for JPA transaction 28 22:19:35- DEBUG - o.h.e.t.internal.TransactionImpl-51. Кроме того, autoCommit определенно должен быть false.
@Saif, пожалуйста, создайте проблему / прокомментируйте свои данные в репозитории HikariCP github, надеемся, что сообщество HikariCP сможет решить эту проблему или подскажет вам решение
спасибо @brettw за предложение. Впоследствии эта проблема была решена, не удалось опубликовать сообщение из-за отсутствия деталей. Спасибо, в любом случае.
Это не было проблемой с Хикари, в моем конце была ошибка. Все еще размещаю подробности того, как это произошло, на случай, если это кому-то поможет.
Я использовал spring boot 1.5.6 (это была последняя версия, когда я начал работать).
Эта версия включала spring-orm 4.3.1. Эта версия spring-orm включала поддержку трех версий гибернации: 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.
Здравствуйте, @saif, можете ли вы предложить мне конфигурацию, потому что после прочтения вашего сообщения я также не могу исправить проблему с пулом hikari
Ваш код не возвращает подключения к пулу. Это не имеет ничего общего с настройкой конфигурации idleTimeout.