Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >十二、Hikari:Apparent connection leak detected连接泄露分析

十二、Hikari:Apparent connection leak detected连接泄露分析

原创
作者头像
用户1422411
发布于 2022-06-25 09:56:43
发布于 2022-06-25 09:56:43
3.2K0
举报

欢迎访问我的博客,同步更新: 枫山别院

部分报错日志如下:

代码语言:txt
AI代码解释
复制
16-05-2019 13:25:46.494 [HikariPool-1 housekeeper] WARN  com.zaxxer.hikari.pool.ProxyLeakTask.run - Connection leak detection triggered for com.mysql.jdbc.JDBC4Connection@7c3beffb, stack trace follows
java.lang.Exception: Apparent connection leak detected
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
    at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:84)
    at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:70)
    at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:336)
    at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:84)
    at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
    at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)
    at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77)
    at sun.reflect.GeneratedMethodAccessor148.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:434)
    at com.sun.proxy.$Proxy107.selectOne(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:167)

日志显示,检测到了连接泄露

Hikari配置如下:

代码语言:txt
AI代码解释
复制
hikari:
      maximum-pool-size: 100
      minimum-idle: 0
      leak-detection-threshold: 180000
      connection-timeout: 180000
      validation-timeout: 180000
      idle-timeout: 180000

leak-detection-threshold:用来设置连接被占用的超时时间,单位为毫秒,默认为0,表示禁用连接泄露检测。

connection-timeout:从连接池获取连接的超时时间。

分析源代码发现,该错误的原因是从连接池获取连接超时,触发了连接泄露检测。

此处spring调用了doGetConnection从hikari中获取连接,

在org.springframework.jdbc.datasource.DataSourceUtils#doGetConnection中,

image.png
image.png

我们看看hikari中的实现,,进入该方法继续看,

com.zaxxer.hikari.HikariDataSource#getConnection()

image.png
image.png

在com.zaxxer.hikari.pool.HikariPool#getConnection(long)中,

image.png
image.png

com.zaxxer.hikari.pool.ProxyLeakTask#ProxyLeakTask(com.zaxxer.hikari.pool.ProxyLeakTask, com.zaxxer.hikari.pool.PoolEntry)中

image.png
image.png

这个地方是真正的获取连接的实现了,

分析上面的代码会发现,在获取Connection的时候,创建了一个ProxyLeakTask,这个task是一个定时任务,在leakDetectionThreshold毫秒后调用run()方法抛出Apparent connection leak detected异常。

image.png
image.png

也就是说,获取到连接之后使用之前的时间+使用连接的时间+使用之后还回连接之前的时间,超出了leakDetectionThreshold毫秒,就抛出检测到连接泄露的异常。结合我们的业务发现,此处确实是使用连接的时间超出了leakDetectionThreshold毫秒,是因为执行了慢 sql,同时慢 sql 耗尽了连接池的连接,导致新线程获取连接超时,又导致了获取连接超时的报错。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【力扣周赛第313场】全题题解
如果 x 可以同时整除 a 和 b ,则认为 x 是 a 和 b 的一个 公因子 。
六月丶
2022/12/26
3940
【力扣周赛第313场】全题题解
LeetCode周赛305,两千人通过第四题,手速场太可怕……
今天是周一,我们照例来聊聊之前的LeetCode周赛。这次是第305场周赛,这场的赞助商是中国银联。前500名都能获得简历内推的机会。
TechFlow-承志
2022/09/21
4810
LeetCode周赛305,两千人通过第四题,手速场太可怕……
LeetCode周赛301,离大谱,手速场掉分,质量场掉大分……
今天是周一,我们来看下第301场的LeetCode周赛。这一场由中国银联赞助。前500名都有内推的机会,离谱的是老梁我刚好第502名……
TechFlow-承志
2022/09/21
3520
LeetCode周赛301,离大谱,手速场掉分,质量场掉大分……
LeetCode笔记:Weekly Contest 303
这一题我的思路非常的暴力,就是把每一行和每一列的元素全部记录下来,然后比较一下求个积即可。
codename_cys
2022/08/23
2530
LeetCode周赛280场,不讲武德,大家都用动态规划,你用蒙特卡洛瞎蒙?
这场周赛是美团和LeetCode合作举办的,整体的题目质量不错,难度梯度很好,当然题目也相对比较难。
TechFlow-承志
2022/09/22
6650
LeetCode周赛280场,不讲武德,大家都用动态规划,你用蒙特卡洛瞎蒙?
LeetCode 2353. 设计食物评分系统(sortedcontainers)
注意,字符串 x 的字典序比字符串 y 更小的前提是:x 在字典中出现的位置在 y 之前,也就是说,要么 x 是 y 的前缀,或者在满足 x[i] != y[i] 的第一个位置 i 处,x[i] 在字母表中出现的位置在 y[i] 之前。
Michael阿明
2022/07/31
3350
【哈希表与字符串的算法之路:思路与实现】—— LeetCode
这题的思路很简单,在读完题目之后,便可以想到暴力枚举,直接遍历整个数组两遍即可,但是时间复杂度高,下面是运行之后的结果
用户11286421
2025/03/15
860
【哈希表与字符串的算法之路:思路与实现】—— LeetCode
【LeetCode 周赛】很有意思的 T2 题
线性扫描数组,同时检查前驱中匹配的配对数。由于题目只考虑前驱数字的最高位和当前位置的最低位,我们可以维护前驱数字的最高位出现次数。
用户9995743
2023/09/09
2830
【LeetCode 周赛】很有意思的 T2 题
LeetCode周赛288,高难度酣畅淋漓的比赛
这场比赛是由Airwallex 空中云汇举办的,没记错这是一家总部在澳洲的公司,国内的分部在上海。
TechFlow-承志
2022/09/21
5030
LeetCode周赛288,高难度酣畅淋漓的比赛
LeetCode周赛307,亚马逊赞助的高质量场
今天是周一,找惯例我们来聊聊昨天的LeetCode周赛。昨天是LeetCode周赛第307场,由亚马逊赞助。
TechFlow-承志
2022/08/26
3830
LeetCode周赛307,亚马逊赞助的高质量场
LeetCode周赛291,最后5分钟连A两题,不放弃才皆有可能
今天是周一,我们照惯例来聊聊LeetCode周赛。这场比赛的赞助商是FunPlus,我查了一下,这是一家游戏开发公司。
TechFlow-承志
2022/09/21
2870
LeetCode周赛291,最后5分钟连A两题,不放弃才皆有可能
【LeetCode 周赛】数位 DP 模版学会了吗?
我们只需要考虑 1 和 n,每次操作可以把 1 向左边移动一位,或者将 n 向右移动一位,但是考虑到 1 和 n 的移动方向有交叉时,要减少一次操作次数。
用户9995743
2023/09/09
2580
【LeetCode 周赛】数位 DP 模版学会了吗?
LeetCode周赛283,第一名送iWatch,少年你参赛了吗?
老规矩我们来复盘一下第283场的leetcode周赛,赞助商是安贤量化。这次比赛的奖品非常丰富,看得出来是壕气公司。
TechFlow-承志
2022/09/21
5960
LeetCode周赛283,第一名送iWatch,少年你参赛了吗?
新的一年从刷题开始,LeetCode周赛277题解
今天是大年初一,首先给大家拜个年,祝大家上学的学业有成,工作的前程似锦,结婚的家庭美满。
TechFlow-承志
2022/09/22
5970
新的一年从刷题开始,LeetCode周赛277题解
惊呆了,LeetCode居然挂了……LeetCode周赛第281场解析
不知道大家参加了上周日的LeetCode周赛没有,发生了一件活久见的事,LeetCode官网居然挂了,不仅是中国区挂了,而是全站都挂了,国际服的竞赛也进不去了……过了好久才恢复。
TechFlow-承志
2022/09/22
6720
惊呆了,LeetCode居然挂了……LeetCode周赛第281场解析
Leetcode 周赛题解 221
给你一个偶数长度的字符串 s 。将其拆分成长度相同的两半,前一半为 a ,后一半为 b 。
ACM算法日常
2020/12/31
7200
Leetcode 周赛题解 221
map小试牛刀,LeetCode界的abandon有多难?
今天我们来看关于map用法的一道例题,也是LeetCode必刷问题之一。它就是LeetCode第一题——两数之和。
TechFlow-承志
2023/03/02
5670
map小试牛刀,LeetCode界的abandon有多难?
LeetCode周赛295,赛后看了大佬的代码,受益良多……
这一场比赛的赞助商是博乐科技,前1000名都可以获得内推机会。和之前50名、100名获得内推的场次比起来有诚意多了。
TechFlow-承志
2022/09/21
4360
LeetCode周赛295,赛后看了大佬的代码,受益良多……
LeetCode周赛297,一小时AK你也可以
今天是周一,我们照惯例来看看LeetCode周赛。这次周赛是地平线赞助的,如果没记错,这已经不是这个公司第一次赞助了。前5名可以获得直接进入面试的机会,前200名可以获得内推。
TechFlow-承志
2022/09/21
3800
LeetCode周赛297,一小时AK你也可以
前缀树问题-LeetCode 409、412、414、415、419、421
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。 在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。 注意: 假设字符串的长度不会超过 1010。
算法工程师之路
2019/12/30
4830
推荐阅读
相关推荐
【力扣周赛第313场】全题题解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档