Spring Boot:在长时间运行的存储过程中检测到明显的连接泄漏
Posted
技术标签:
【中文标题】Spring Boot:在长时间运行的存储过程中检测到明显的连接泄漏【英文标题】:Spring Boot: Apparent connection leak detected on long running stored procedure 【发布时间】:2020-12-25 06:20:09 【问题描述】:有一种方法可以调用存储过程。根据输入,该过程可以运行很长时间。程序完成后,有一条更新语句。 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] 在 service.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(Native Method) ~[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]
【问题讨论】:
【参考方案1】:问题是由于属性 spring.datasource.hikari.leakDetectionThreshold
将leakDetectionThreshold 增加到20000 或任何适合您的应用程序的值以避免错误。
属性说明,LeakDetectionThreshold 会在您未在定义的时间限制内关闭连接时通知潜在的泄漏。在这里,您可能有查询(或 try 子句中的某些内容)花费的时间超过 x 秒。
【讨论】:
以上是关于Spring Boot:在长时间运行的存储过程中检测到明显的连接泄漏的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot - Mysql Driver - JPA - 在服务器运行发布请求很长时间后显示无法打开 JPA EntityManager 进行事务处理
为啥存储过程要花很长时间才能执行,但过程中的代码自己运行得很快?