当前位置: 首页 > 知识库问答 >
问题:

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

韩弘壮
2023-03-14

我在SpringBoot2中使用Hibernate5.3和Hikari2.7,通过官方的JDBC驱动程序使用FileMaker16数据源。

FileMaker服务器性能较差,SQL查询执行时间对于大表可以达到一分钟。有时,当连接池充满从未释放的活动连接时,它会导致连接泄漏。

问题是如何强制挂在池中的活动连接关闭,比如两分钟,将它们闲置并再次使用。

例如,我使用org中的findAll方法通过RestController访问FileMaker数据源。springframework。数据存储库。分页和排序存储库

@RestController
public class PatientController {

    @Autowired
    private PatientRepository repository;

    @GetMapping("/patients")
    public Page<Patient> find(Pageable pageable) {
        return repository.findAll(pageable);
    }
}

在raw中调用/patients几次会导致连接泄漏,Hikari报告如下:

2018-09-20 13:49:00.939调试1---[l-1管家]com。扎克塞尔。希卡里。水塘HikariPool:HikariPool-1-池统计信息(总计=10,活动=10,空闲=0,等待=2)

它还抛出如下异常:

java.lang.Exception: Apparent connection leak detected
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128) ~[HikariCP-2.7.9.jar!/:na]

我需要的是if存储库。findAll需要N秒以上的时间,连接必须终止,控制器方法必须抛出异常。如何实现?

这是我的Hikari配置:

 allowPoolSuspension.............false
 autoCommit......................true
 catalog.........................none
 connectionInitSql...............none
 connectionTestQuery............."SELECT COUNT(*) FROM Clinics"
 connectionTimeout...............30000
 dataSource......................none
 dataSourceClassName.............none
 dataSourceJNDI..................none
 dataSourceProperties............{password=<masked>}
 driverClassName................."com.filemaker.jdbc.Driver"
 healthCheckProperties...........{}
 healthCheckRegistry.............none
 idleTimeout.....................600000
 initializationFailFast..........true
 initializationFailTimeout.......1
 isolateInternalQueries..........false
 jdbc4ConnectionTest.............false
 jdbcUrl.........................jdbc:filemaker://***:2399/ec_data
 leakDetectionThreshold..........90000
 maxLifetime.....................1800000
 maximumPoolSize.................10
 metricRegistry..................none
 metricsTrackerFactory...........none
 minimumIdle.....................10
 password........................<masked>
 poolName........................"HikariPool-1"
 readOnly........................false
 registerMbeans..................false
 scheduledExecutor...............none
 scheduledExecutorService........internal
 schema..........................none
 threadFactory...................internal
 transactionIsolation............default
 username........................"CHC"
 validationTimeout...............5000

共有2个答案

李光华
2023-03-14

filemaker JDBC驱动程序忽略javax。坚持不懈查询timeout参数,即使超时值是在java的驱动程序实现中设置的。sql。setQueryTimeoutsetter。因此,我通过扩展类com解决了这个问题。文件制作人。jdbc。驱动程序并重写connect方法,以便将sockettimeout参数添加到连接属性中。有了这个参数,如果超时期间没有数据来自套接字,FM JDBC驱动程序就会中断连接。

我还向filemaker提交了一个问题:https://community.filemaker.com/message/798471

太叔志文
2023-03-14

HikariCP只关注于连接池管理,而不是管理由其形成的连接。

loginTimeout-HikariCP将等待多长时间来形成到数据库的连接(基本上是JDBC连接)

spring.datasource.hikari.connectionTimeout=30000

maxLifetime-连接在关闭前在池中的生存时间

spring.datasource.hikari.maxLifetime=1800000

idleTimeout-池中未使用的连接的使用时间

spring.datasource.hikari.idleTimeout=30000

使用javax。坚持不懈查询超时,如果所用时间超过定义的超时,则取消请求。

javax。坚持不懈查询超时(长–毫秒)

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

 类似资料:
  • 我在webapp(hibernate-core-4.3.8。Final和Spring 3.2.11。RELEASE)上使用Spring和hibernate。我使用hikaricp(v 2.2.5)作为连接池impl,它检测连接泄漏并打印下面的stacktrac。我使用Spring的声明性事务划分,因此我假设资源的管理和清理是由Spring/hibernate完成的。因此,我认为Spring或hib

  • 我的连接器类: 连接器。JAVA 这是我的DAO类(简化):UserDAO. java 在这里,我发现了关于Hikari的一些事实的问题: 您必须在HikariCP为您提供的连接实例上调用关闭() 可能是我的不起作用,因为它只是Hikari在方法中提供给我的连接的副本。

  • 我正在使用Eclipse,并执行下面的函数,碰巧我打开了一个扫描器,然后,最后我关闭了它,但Eclipse一直说它没有关闭“资源泄漏:'Scanner'没有关闭”。我可以用try with resources来完成,警告消失了,但我想知道为什么我在这里尝试的方式不起作用

  • 是否可以在2.3.9版本中启用泄漏检测?正如我之前在这个问题中所说,HiberNate使用的是HikariCP的2.3.3版本。截至2016年2月,他们已经升级了HikariCP的版本,但不幸的是升级到了2.3.9版本 我需要启用泄漏检测才能修复它们。我已将以下行添加到Hibernate配置文件中: 前两行运行正常,可以在调试日志中看到,但是当我添加第三行时,我无法运行应用程序。我也尝试过用代码添

  • 问题内容: 有关关闭Java中数据库连接的后续问题 我知道conn.close()是必需的,但不知道为什么。一旦方法调用结束,垃圾收集器是否会释放连接对象(并释放连接对象中存储的所有指向数据库的处理程序)? 问题答案: 一旦方法调用结束,垃圾收集器是否会释放连接对象(并释放连接对象中存储的所有指向数据库的处理程序)? 没有。JDBC驱动程序保留对连接的引用,因此除非您可以关闭(),否则它不会被清除

  • 为什么Eclipse在下面的代码中给了我变暖的“资源泄漏:'in'从不关闭”?