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

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

相关推荐
MZ_ZXD001几秒前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
PP东3 分钟前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable
ManThink Technology8 分钟前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络
invicinble12 分钟前
springboot的核心实现机制原理
java·spring boot·后端
人道领域20 分钟前
SSM框架从入门到入土(AOP面向切面编程)
java·开发语言
大模型玩家七七40 分钟前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
CodeToGym1 小时前
【Java 办公自动化】Apache POI 入门:手把手教你实现 Excel 导入与导出
java·apache·excel
凡人叶枫1 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
JMchen1232 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
阔皮大师2 小时前
INote轻量文本编辑器
java·javascript·python·c#