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
このログを見つけました。HikariCP このスレッドで接続時のリセット (autoCommit) について調べました。両側(ハイバネートとヒカリ)で同じ(真)を設定しよauto commit
うとし、両側でも偽で試しました。まだ運がない。を有効
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
すべてのアイドル接続aは、
idle
フォームpostgres
の視点であり、active
フォーム光の視点です。そのため、データベースからのアイドル接続が 5 つある場合はtoatal = 5, active=4, idle = ,waiting=0
、ひかりログに表示されます。
ノート:
この正確な問題https://github.com/brettwooldridge/HikariCP/issues/109が発生している可能性があります。私の場合、トランザクションごとにアクティブな接続が増加しています。
HikariCP - 接続が利用できません。これも同じ問題です。しかし、誰もこれに対する明確な解決策を提供していません。ところで
@Transactional
、受け入れられた回答で示唆されているように、物乞いから使用していました。