连接池耗尽了!!!

Posted IT技术圈子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了连接池耗尽了!!!相关的知识,希望对你有一定的参考价值。

连接池耗尽了!!!

问题出现

早上微信朋友咨询一个压测问题:应用程序开启事务后,QPS上不去.请求一起定位问题

问题定位

查看请求方法,结构如下:

@Transactional
public void longTransactionalFunction(Order bo) {
//预处理对象
OrderPred orderPred =pre(bo);
//调用RPC处理订单相关
callRPC(orderPred);
try {
//保存库
orderDAO.save(orederPred);
} catch (Exception e) {
e.printStackTrace();
}
}

可以很清晰的看到,在本地事务中调用了RPC方法。问题出现的地方已经很明显了,就是本地长事务占用了连接池的有效连接,导致后续调用挂起等待。自然QPS上不去。

解决方案

将RPC调用放到事务之外,调整后的代码如下:

public void saveOrder(Order bo){
//预处理对象
OrderPred orderPred =pre(bo);
//调用RPC处理订单相关
callRPC(orderPred);
shortTransactionalFunction(orderPred);
}

@Transactional
public void shortTransactionalFunction(Order bo) {
try {
//保存库
orderDAO.save(orederPred);
} catch (Exception e) {
e.printStackTrace();
}
}

这样,开启事务的部分仅处理有效的保存订单的操作.有效的提高了QPS

思考点

阿里巴巴规范

【参考】 @Transactional 事务不要滥用。事务会影响数据库的 QPS,另外使用事务的地方需 要考虑各方面的回滚方案,包括缓存回滚、搜索引擎回滚、消息补偿、统计修正等。

可以看到阿里规范上已经告诫我们不要滥用本地的Transactional。那么什么是滥用了?我的理解就是不要随便在有事务的方法上注上@Transactional就完事了,需要认真去考虑哪些操作确实是需要事务控制的。特别是一些耗时的处理或则远程调用(远程调用无法靠本地事务控制)更需要全面评估。

关联点

1、数据库连接池 2、mysql事务 3、分布式事务


以上是关于连接池耗尽了!!!的主要内容,如果未能解决你的问题,请参考以下文章

JDBC MySql 连接池实践避免连接池耗尽

DB连接池连不上,连接池耗尽

AtomikosSQLException:连接池已耗尽 - 每当应用程序抛出异常时,连接就会耗尽

连接池连接耗尽导致Tomcat假死的排查心路

服务器HttpClient连接池耗尽问题排查与解决

rabbitMQ队列处理导致连接池耗尽Tomcat假死问题排查处理