为了账号安全,请及时绑定邮箱和手机立即绑定

强制 Hikari/Hibernate 关闭陈旧(泄漏?)连接

强制 Hikari/Hibernate 关闭陈旧(泄漏?)连接

catspeake 2021-09-29 17:16:42
我正在使用带有 Hibernate 5.3 和 Hikari 2.7 的 Spring Boot 2 中的官方 JDBC 驱动程序使用 FileMaker 16 数据源。FileMaker 服务器性能较差,对于大表,SQL 查询执行时间可达一分钟。有时会导致连接泄漏,因为连接池中充满了永远不会释放的活动连接。问题是如何强制池中已经挂在那里两分钟的活动连接关闭,将它们移动到空闲状态并再次使用。例如,我使用以下findAll方法通过 RestController 访问 FileMaker 数据源org.springframework.data.repository.PagingAndSortingRepository:@RestControllerpublic class PatientController {    @Autowired    private PatientRepository repository;    @GetMapping("/patients")    public Page<Patient> find(Pageable pageable) {        return repository.findAll(pageable);    }}/patients在 raw 中调用几次会导致连接泄漏,这是 Hikari 报告的内容:2018-09-20 13:49:00.939 调试 1 --- [l-1 管家] com.zaxxer.hikari.pool.HikariPool :HikariPool-1 - 池统计(总计 = 10,活动 = 10,空闲 = 0,等待=2)它还会抛出这样的异常:java.lang.Exception: Apparent connection leak detectedat com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128) ~[HikariCP-2.7.9.jar!/:na]我需要的是,如果repository.findAll需要超过 N 秒,则必须终止连接并且控制器方法必须抛出异常。如何实现?
查看完整描述

2 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

HikariCP 只专注于连接池管理来管理它从中形成的连接。

loginTimeout - HikariCP 将等待与数据库建立连接的时间(基本上是 JDBC 连接)

spring.datasource.hikari.connectionTimeout=30000

maxLifetime - 连接在关闭前会在池中存活多久

spring.datasource.hikari.maxLifetime=1800000

idleTimeout - 未使用的连接在池中存在多长时间

spring.datasource.hikari.idleTimeout=30000

如果请求时间超过定义的超时时间,请使用 javax.persistence.query.timeout 取消请求。

javax.persistence.query.timeout(长 - 毫秒)

javax.persistence.query.timeout 提示定义了查询在被取消之前允许运行多长时间。Hibernate 本身不处理此超时,而是通过 JDBC Statement.setTimeout 方法将其提供给 JDBC 驱动程序。


查看完整回答
反对 回复 2021-09-29
  • 2 回答
  • 0 关注
  • 344 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信