Hikari连接池

工作中遇到了这个异常:

java 复制代码
org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
	at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:309)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.startTransaction(AbstractPlatformTransactionManager.java:400)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:595)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:382)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698)
	at com.xiaomi.mina.ai.agent.service.AgentService$$EnhancerBySpringCGLIB$$d2b469e8.baiduPublish(<generated>)

经过学习,发现该异常是请求获取Hikari连接池时超时,也就是说连接池中的连接不够用了。为了弄清楚真实原理,于是我测试了一下:

我用的是Hikari默认配置:

haskell 复制代码
maximum-pool-size=10     # 最大连接数
connection-timeout=30000 # 获取连接超时时间(30秒)

然后我写了段代码进行测试:

发现请求10次后,再次请求就不会进入到该方法,并且经过30s后就会抛出开头的异常,测试结果和我预想的一样。

于是我就排查我的业务代码,看是否有耗时情况,发现代码中有下载上传文件的逻辑,比较耗时,就会造成持续占据数据库连接不释放,导致异常。

haskell 复制代码
因为数据库连接池是应用级别的的资源,会造成该应用中别的业务也会获取不到连接池
造成整个服务瘫痪,很致命。

因此,我们在写业务代码时,禁止将耗时的操作放到事务里。

相关推荐
杰哥哥不是个好叔叔1 小时前
【Spring AI】Spring AI 2.0.1 新特性袭来
java·人工智能·spring
莫陌尛.1 小时前
Java核心知识点:直接内存、CPU密集型线程池、并行流对比文档
java·开发语言
Zane19941 小时前
自定义异常该继承 Exception 还是 RuntimeException,就看这一个问题
java·后端
西峰u1 小时前
Java多线程初阶完整总结|线程、锁、volatile、等待通知、常见案例
java·开发语言·jvm
爱喝可乐的中登1 小时前
SpringBoot 云边协同|智慧地铁 ISCS 改造实战第 10 篇:全网权限与数据隔离重构|线路‑车站‑专业三级 RBAC、边缘数据权限下沉
java·spring boot·重构
落魄实习生2 小时前
Spring AI Alibaba入门-生态集成
java·人工智能·spring
重生之我是Java开发战士2 小时前
【Java EE】认识Linux与项目部署
java·linux·java-ee
LXMXHJ2 小时前
springboot项目测试
java·spring boot·后端·测试
程序员雪球2 小时前
本地IDEA打断点debug容器
java·开发语言
码匠许师傅2 小时前
【设计模式精讲】2. 设计原则基石:SOLID 与几条关键原则
java·设计模式·log4j