Apparent connection leak detected

异常信息:

java.lang.Exception: Apparent connection leak detected
at com.sq.driver.datasource.HikariDatasourceWrap.initDatasource(HikariDatasourceWrap.java:73)
at com.sq.config.cache.BaseNodeResource$Builder.lambda$withFactory$2(BaseNodeResource.java:280)
at com.sq.config.cache.BaseNodeResource.get(BaseNodeResource.java:129)
at com.sq.driver.datasource.HikariDatasourceWrap.warmup(HikariDatasourceWrap.java:171)
at com.sq.pool.core.spring.WarmupProcess.onApplicationEvent(WarmupProcess.java:34)
at com.sq.pool.core.spring.WarmupProcess.onApplicationEvent(WarmupProcess.java:20)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:163)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:136)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:381)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:335)
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:855)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4853)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5314)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)

数据源配置:

<?xml version="1.0" encoding="utf-8"?>

<config>
<value>{"name":"pool","driverClassName":"com.mysql.jdbc.Driver", "jdbcUrl":"jdbc:mysql://************************************:8888/dispatcher?zeroDateTimeBehavior=convertToNull&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;connectTimeout=1000&amp;socketTimeout=15000", "username":"*******", "password": "*************", "maximumPoolSize":20, "minimumIdle":20, "connectionTimeout":3000, "leakDetectionThreshold":10000}</value>
</config>

 

原理介绍:

leakDetectionThreshold 设定了连接泄露阀值10s,即当从连接池里取出连接超过10s不归还时,会warn  Apparent connection leak detected

HikariPool#getConnection

ProxyLeakTask#ProxyLeakTask

在连接归还或被踢除时,会清除此调度任务,详见ProxyConnection。即在10s内归还连接,会清除调度任务。超过10s调度任务执行。

清除调度任务时,如果已经超过调度时间,会LOGGER.info("Previously reported leaked connection {} was returned to the pool (unleaked)", connectionName);。详见ProxyLeakTask#cancel。

 

解决方案:

只借不还,浪费资源。有借须有还,将connection归还。

HikariDatasourceWrap#initDatasource

 

总结:

    这个case中最大的亮点是。Hikari warn日志中详细的打印出,存在连接泄露的代码行数,异常信息非常直白易懂。实现逻辑详见 ProxyLeakTask#ProxyLeakTask    ProxyLeakTask#run。优秀的代码设计+不错的性能,也难怪SpringBoot2.0起默认数据库连接池从TomcatPool换到了「HikariCP」。

 

1

 

HikariCP是一个高性能的数据库连接池,当出现"Apparent connection leak detected"(检测到明显的连接泄漏)的错误时,这通常意味着你的应用程序没有正确地释放数据库连接,导致连接池中的连接没有被归还。 出现这个错误的原因可能有多种可能性,以下是一些常见的问题和解决方法: 1. 确保你在使用完数据库连接后,调用了`connection.close()`方法将连接归还给连接池。最好在`finally`块中进行连接的释放,以确保无论是否发生异常,连接都能正确地关闭。 2. 确保你在使用完数据库连接后,调用了相关资源(如`Statement`或`ResultSet`)的关闭方法。如果你没有正确关闭这些资源,连接可能不会被释放。 3. 确保你在使用完数据库连接后,将连接返回到连接池。如果你手动管理连接,确保调用连接池的`connection.close()`方法来关闭连接。 4. 检查你的代码是否存在长时间持有数据库连接的情况。长时间占用连接可能导致连接池中的连接不足,并导致连接泄漏。 5. 检查数据库操作过程中是否发生了未捕获的异常。如果发生异常,确保在异常处理中正确地关闭连接。 6. 调整连接池的配置参数,如`maximumPoolSize`(最大连接数)和`idleTimeout`(连接的空闲超时时间),以适应你的应用程序需求。 通过仔细检查你的代码,确保在使用完数据库连接后正确地释放连接,可以帮助解决连接泄漏的问题。如果问题仍然存在,请提供更多的错误信息和相关代码,以便我能够提供更具体的帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值