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
ms/30秒のアイドル状態の後に解放されることです。
問題は、すべてのアイドル接続をそのままにして、新しい接続が要求されるたびに発生することです。そのため、しばらくして20のアイドル接続が発生し、新しいリクエストでヒカリは新しい接続を取得して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
を同じ(true)に設定し、両側でも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
form postgres
point of andactive
form hikari point ofビュー。そのため、データベースからのアイドル接続が5つある場合、Hikariログにtoatal = 5, active=4, idle = ,waiting=0
があります。
注:
私はこの正確な問題を抱えている可能性があります https://github.com/brettwooldridge/HikariCP/issues/109 私の場合、すべてのトランザクションでアクティブな接続が増加しています。
HikariCP-接続は利用できません これも同じ問題です。しかし、誰もこれに対する明確な解決策を提供していません。ところで、私は受け入れられた答えが示唆するように、物ggingいから@Transactional
を使用していました。
これは光の問題ではありませんでした。私の終わりに間違いがありました。誰かを助けるために、これがどのように発生したかの詳細をまだ投稿しています。
spring boot 1.5.6
を使用していました(作業を開始したとき、これが最新バージョンでした)。このバージョンにはspring-orm 4.3.1
が含まれていました。このバージョンのspring-orm
には、Hibernate5
、Hibernate4
、Hibernate3
の3つのバージョンのhibernateのサポートが含まれていました。
そこで、current_session_context_class
の以下の設定でスプリングブートを設定しました。
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
光の接続管理に至るまで、すべてが正常に機能していました。起こったのは、spring-boot-starter-jpa
が含まれる1.5.6のHibernate5
(つまり、休止状態のコア)です。
したがって、DB操作を実行すると、その接続の制御が失われます(このバージョンの不一致の可能性が最も高い)。したがって、問題。
変更後
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に切り替えます。