当前位置: 首页 > news >正文

Apparent connection leak detected问题排查

定位:

  1. 华为云服务器日志上搜索该异常,日志如下(#1),观察日志后主要看到 连接泄漏发生在 SupplierProductFileOpsAppService.readDataFromExcelAttach()方法中,打印的线程名:TyFileOpsThread-Attachworker-5
  2. 在发现该方法的问题后定位系统代码,发现最外层加了事务注解,代码主要是 解析Excel,业务操作,更新 tyfile文件状态信息这些事
  3. hikari 配置项参数(#2)
  4. 通过配置项知道了我们的连接被占用的超时时间为6秒,所以考虑到是不是任务执行过长导致连接超时,于是加入日志后发现:(#3)
  5. 整个任务执行耗时几乎全部被业务逻辑占用了,数据量上来后当然会超过6秒,就会被监测到打印连接异常

解决:

  1. 优化业务逻辑代码
  2. 适当提高监测超时时间(leak-detection-threshold: 60000

补充:

此次排查虽然没有发现明显的代码层面的问题,但给了我们一定的排查思路,我们是业务逻辑耗时较长,如感觉业务逻辑没那么复杂但依旧存在此问题,那可能需要看一下除了业务逻辑外的其他操作是否耗时较长,考虑将业务逻辑和文件IO等隔离开,业务逻辑放在一个事务中

#1

2025-06-04 11:04:15.573 [HikariPool-1 housekeeper] [31mWARN[0;39m [traceId = ] [srcapp = ] [c.z.hikari.pool.ProxyLeakTask.run:84] - Connection leak detection triggered for com.mysql.cj.jdbc.ConnectionImpl@5fd6c78e on thread TyFileOpsThread-Attachworker-5, stack trace follows
-2
2025-06-04 11:04:15.573 [HikariPool-1 housekeeper] [31mWARN[0;39m [traceId = ] [srcapp = ] [c.z.hikari.pool.ProxyLeakTask.run:84] - Connection leak detection triggered for com.mysql.cj.jdbc.ConnectionImpl@5fd6c78e on thread TyFileOpsThread-Attachworker-5, stack trace follows
-1
java.lang.Exception: Apparent connection leak detected
0
java.lang.Exception: Apparent connection leak detected
1
        at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128)
2
        at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128)
3
        at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:265)
4
        at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:265)
5
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.startTransaction(AbstractPlatformTransactionManager.java:400)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750)
19
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692)
20
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692)
21        at com.ehsy.app.productsupply.executor.job.ProductSupplyUploadHandleJob.doHandle(ProductSupplyUploadHandleJob.java:52)
24
        at com.ehsy.app.productsupply.executor.job.ProductSupplyUploadHandleJob.doHandle(ProductSupplyUploadHandleJob.java:52)
25
        at com.ehsy.app.fileops.executor.job.AbstractAttachHandleJob.execute(AbstractAttachHandleJob.java:26)
26
        at com.ehsy.app.fileops.executor.job.AbstractAttachHandleJob.execute(AbstractAttachHandleJob.java:26)
27
        at com.ehsy.app.fileops.executor.worker.TyFileOpsRecordAttachWorker.doUpload(TyFileOpsRecordAttachWorker.java:160)
28        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
36
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
37
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
38
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
39
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
44
47
        at java.lang.Thread.run(Thread.java:750)
48
        at java.lang.Thread.run(Thread.java:750)

#2

hikari:
  auto-commit: true
  connection-timeout: 60000 #连接的最大等待时间(毫秒)作用: 在连接池中没有可用连接时,客户端等待连接可用的时间。超时则抛出 SQLException
  idle-timeout: 60000 #空闲连接在被回收之前允许保持空闲状态的最长时间(毫秒) 作用: 如果连接空闲时间超过这个值,且当前空闲连接数超过 minimum-idle,则这个连接会被关闭。
  leak-detection-threshold: 6000 #启用连接泄露检测,连接泄露检测阈值为6秒,任何超过6秒连接占用将被记录,有助于找到没有正确关闭连接的代码路径
  max-lifetime: 6000   #连接池中每个连接允许存活的最长时间(毫秒)  作用: 任何连接在池中存活时间超过这个值后都会被回收,即使它没有处于空闲状态。
  maximum-pool-size: 20  #连接池中允许的最大连接数  作用: 限制连接池中同时存在的最大连接数。超过这个数量的连接请求将被阻塞或超时。
  minimum-idle: 10  # 连接池中保持的最小空闲连接数,作用: 确保连接池中至少有这么多空闲连接。即使没有连接请求,也会保持这个数量的连接处于空闲状态。

#3

开始处理Excel附件,业务类型: SUPPLIER_PRODUCT_PURCHASE_PRICE, 附件ID: 1928359950445105153
业务处理完成,耗时: 271250ms
处理结束,总耗时: 271507ms | 业务类型: SUPPLIER_PRODUCT_PURCHASE_PRICE, 附件ID: 1928359950445105153

相关文章:

  • Java Lombok @Data 注解用法详解
  • Reids 如何处理缓存穿透、缓存击穿、缓存雪崩问题?
  • 常用的Docker命令
  • 通用寄存器的 “不通用“ 陷阱:AX/CX/DX 的寻址禁区与突围之道
  • 代码训练LeetCode(22)研究者H指数
  • 防止网站被iframe嵌套的安全防护指南
  • 多线程编程技术解析及示例:pthread_cond_timedwait、pthread_mutex_lock 和 pthread_mutex_trylock
  • 数学知识体系难易程度表及关系
  • 蓝牙防丢器应用方案
  • 贝叶斯优化+LSTM+时序预测=Nature子刊!
  • Elasticsearch的写入性能优化
  • 高速ADC数据格式与JESD204B IP数据格式映射关系
  • FART 精准脱壳:通过配置文件控制脱壳节奏与范围
  • AI,如何重构理解、匹配与决策?
  • Oracle数据库笔记
  • [C]extern声明变量报错:undefined reference终极解决方案
  • 第五期书生大模型实战营-《L1G1-玩转书生大模型 API 之 Browser-Use 实践》
  • 若依Ruoyi中优先从本地文件加载静态资源
  • 理解网络协议
  • 3D动画在微信小程序的实现方法
  • 建立一个购物网站/seo网站推广收费
  • 杭州做企业网站/百度贴吧热线客服24小时
  • 学校网站的图片轮播怎么做/湘潭网页设计
  • 太原网站建设-中国互联/免费发布推广信息的平台
  • dede做购物网站/宁波网络营销推广公司
  • 网上买手表哪个网站可以买到正品/链接提取视频的网站