如何解决Spring Boot:在长时间运行的存储过程中检测到明显的连接泄漏
有一个调用存储过程的方法,该过程可以根据输入长时间运行。程序完成后,有一条更新语句。在调用过程的方法中检测到HikariCP-Connection泄漏,有时过程失败。请提及要为HikariCP更改的任何特定属性(当前使用默认属性),或为解决此问题而对代码进行的任何更改。
public void procedure (String[] names){
try(Connection connection = getJdbcTemplate().getDataSource().get connection()){
Oracle connection oracleConnection = connection.unwrap(OracleConnection.class);
AbstractSqlTypeValue names = new OracleArrayType(oracle connection,names);
.... //execute procedure
....// update status
}catch block
}
2020-08-20 14:01:24.880 WARN 14366 --- [l-1管家] com.zaxxer.hikari.pool.ProxyLeakTask:为线程oracle,jdbc.driver.T4CConnection触发了连接泄漏检测跟踪如下
java.lang.Exception:检测到明显的连接泄漏 在com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128)〜[HikariCP-2.7.9.jar:na] 在service.Procedure.execute(Procedure.java:58)〜[classes /:na] 在service.Procedure.Procedure(Procedure.java:46)〜[classes /:na] 在服务时。Procedure$$ FastClassBySpringCGLIB $$ f.invoke()〜[classes /:na] 在org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)〜[spring-core-5.0.10.RELEASE.jar:5.0.10.RELEASE] 在org.springframework.aop.framework.CglibAopProxy $ CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746)〜[spring-aop-5.0.10.RELEASE.jar:5.0.10.RELEASE] 在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)〜[spring-aop-5.0.10.RELEASE.jar:5.0.10.RELEASE] 在org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)〜[spring-tx-5.0.10.RELEASE.jar:5.0.10.RELEASE] 在org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)〜[spring-tx-5.0.10.RELEASE.jar:5.0.10.RELEASE] 在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)〜[spring-aop-5.0.10.RELEASE.jar:5.0.10.RELEASE] 在org.springframework.aop.framework.CglibAopProxy $ DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)〜[spring-aop-5.0.10.RELEASE.jar:5.0.10.RELEASE] 在service.ProcedureService $$ EnhancerBySpringCGLIB $$ 8.Procedure()〜[classes /:na] 在java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)〜[na:na] 在java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)〜[na:na] 在java.base / jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)〜[na:na] 在java.base / java.lang.reflect.Method.invoke(Method.java:566)〜[na:na]
解决方法
问题是由于属性spring.datasource.hikari.leakDetectionThreshold
将leakDetectionThreshold 增加到20000 或任何适合您的应用程序以避免错误。
属性说明,LeakDetectionThreshold 会在您未在定义的时间限制内关闭连接时通知潜在的泄漏。这里可能您有查询(或 try 子句中的某些内容)花费的时间超过 x 秒。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。