我在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
filemaker JDBC驱动程序忽略javax。坚持不懈查询timeout
参数,即使超时值是在java的驱动程序实现中设置的。sql。setQueryTimeout
setter。因此,我通过扩展类com解决了这个问题。文件制作人。jdbc。驱动程序
并重写connect
方法,以便将sockettimeout
参数添加到连接属性中。有了这个参数,如果超时期间没有数据来自套接字,FM JDBC驱动程序就会中断连接。
我还向filemaker提交了一个问题:https://community.filemaker.com/message/798471
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'从不关闭”?