spring – HikariCP空闲连接在连接池中保持活动状态

前端之家收集整理的这篇文章主要介绍了spring – 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 – 连接不可用,请求在30001ms后超时.

那么,我做错了什么.或者误解了配置?

Hikari初始化日志:

SpringBootJPAHikariCP - configuration:
 allowPoolSuspension.............false
 autoCommit......................true
 catalog.........................none
 connectionInitsql...............none
 connectionTestQuery.............none
 connectionTimeout...............30000
 dataSource......................none
 dataSourceClassName.............none
 dataSourceJNDI..................none
 dataSourceProperties............{password=sql.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........................

更新:
在过去的24小时内,我尝试了不同线程的几个解决方案,但没有一个解决了我的问题.所以这里的观察可能很重要.

> SpringBootJPAHikariCP – 重置(autoCommit)连接org.postgresql.jdbc.PgConnection@1344bbf1找到此日志.研究
Reset (autoCommit) on connection in HikariCP这个帖子.试图在两侧设置自动提交相同(true)(hibernate和Hikari),并尝试在两侧使用false.仍然没有运气.
>启用leakDetectionThreshold,获得泄漏检测异常.所以试图了解hibernate / spring事务管理器是否释放连接.从波纹管Logs看起来它看起来像hibernate正常工作.

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

>所有空闲连接都是从postgres的角度来看是空闲的,并且活跃形式是Hikari的观点.所以当数据库有5个空闲连接时,Hikari日志中有toatal = 5,active = 4,idle =,waiting = 0.

注意:

>可能是我在这个问题中遇到了这个问题https://github.com/brettwooldridge/HikariCP/issues/109活动连接随着每笔交易而增加.
> HikariCP – connection is not available这也是同一个问题.但没人提供明确的解决方案.顺便说一句,我正在接受@Transactional的乞讨,如接受的答案所示.

最佳答案
这不是任何Hikari问题,我最终有一个错误.仍然发布有关为什么会发生这种情况的详细信息,以防有人帮忙.

我使用的是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 for 1.5.6包括Hibernate5(我的意思是hibernate核心).

因此,执行任何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.

猜你在找的Spring相关文章