我使用的是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
我期待的是,空闲连接应该是3万毫秒/ 空闲后释放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=
更新:
在过去的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乞讨,如答案所示.