带有 Hikari 的 Spring JPA 未释放连接

Posted

技术标签:

【中文标题】带有 Hikari 的 Spring JPA 未释放连接【英文标题】:Spring JPA with Hikari not releasing connection 【发布时间】:2019-07-13 17:31:33 【问题描述】:

我有一个带有控制器的 Spring Boot 应用程序。当我尝试同时访问一个 API(35 次并行命中)时,它会进入控制器,但我正在使用 findOne of the crudrepository 来检查 postgres 中的一些数据。 findOne 函数以毫秒为单位返回,但下一个 API 没有获取 postgres 连接。

我使用 HikariCp 作为具有以下设置的连接池

hikari:
 idleTimeout: 10000
 connectionTimeout: 60000
 maximumPoolSize: 30
 minimumIdle: 2
 poolName: gor-srms
 leakDetectionThreshold: 10000

简而言之,任何时候只有 30 个 API 并行工作。 API 完成后,只有下一个获得 postgres 连接。

由于 findOne 调用只需要大约几毫秒即可完成,为什么 postgres 连接没有被用于其他 API?

添加完整的应用程序属性:

server:
   port: $SERVER_PORT:$PORT:8093
   contextPath: $mdm.service.contextPath:/wms-masterdata

spring:
  application:
    name: $mdm.service.name:mdm-service
  jmx:
    enabled: false
  profiles:
    active: local
  cloud:
    config:
      discovery:
        enabled: false
        serviceId: config-server
  jpa:
      hibernate:
        ddl-auto: validate
  http:
      multipart:
        max-file-size: 20MB
        max-request-size: 20MB

discovery:
  enabled: true

eureka:
  client:
    enabled: $discovery.enabled:true
    serviceUrl:
      defaultZone: $discovery.url:$REGISTRY_SERVICE_URL:http://localhost:8761/eureka/
  instance:
    metadataMap:
      contextPath: $server.contextPath

db:
  driver: org.postgresql.Driver
  url: jdbc:postgresql://$database.ip:localhost:5432/wms_masterdata
  username: postgres
  password: postgres

hikari:
  idleTimeout: 10000
  connectionTimeout: 60000
  maximumPoolSize: 10
  minimumIdle: 2
  poolName: gor-mdm
  leakDetectionThreshold: 60000

hibernate:
  unit_name: wms_masterdata
  show_sql: false
  generate_ddl: false

entitymanager:
  packagesToScan: com.gor.platform.mdm.service.model

butler:
  url: https://192.168.8.116

management:
  security:
    enabled: false
  health:
    db:
      enabled: false

security:
  basic:
    enabled: false

flyway:
  baseline-on-migrate: true
  enabled: true
  ignore-ignored-migrations: true

【问题讨论】:

您是否尝试增加池大小并尝试一下。您还设置了数据源类型。你能从应用程序属性中分享完整的配置吗? 我可以处理的并行 API 的数量总是等于最大池大小。 @ArpanAgrawal 问题解决了吗? 【参考方案1】:
spring.datasource.TYPE=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=20
spring.datasource.hikari.idleTimeout=30000
spring.datasource.hikari.poolName=SpringBootJPAHikariCP
spring.datasource.hikari.maxLifetime=2000000
spring.datasource.hikari.testWhileIdle=true
spring.datasource.hikari.validationQuery=SELECT 1
spring.datasource.hikari.connectionTimeout=30000 

拥有这种设置有助于高效的连接池并允许提供更多流量。

【讨论】:

spring.datasource.hikari.connection-test-query和spring.datasource.hikari.connection-test-query有什么区别 你错过了两个不同的名字吗?【参考方案2】:

我终于能够通过设置 spring.jpa.open-in-view=false 来解决这个问题。请注意,这可能会导致 LazyInitialization Exception

【讨论】:

以上是关于带有 Hikari 的 Spring JPA 未释放连接的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot JPA Repository 未释放 Hikari DB Connection

试图在我的代码中找到数据库连接泄漏,使用 Spring / JPA / Hikari

Spring Boot : ORM 框架 JPA 与连接池 Hikari

尝试使用Spring / JPA / Hikari在我的代码中查找数据库连接泄漏

Spring boot Oracle JPA 设置 QueryTimeout

带有 mysql 的 Spring Boot 应用程序卡在“Hikari-Pool-1 - 正在启动...”