[Java] Spring事务REQUIRES_NEW导致项目没有响应-原因DB maxActive没设置
环境
Spring 4.3
commons-dbcp-1.4.jar
我的项目是micro service 用Eureka 实现的。
问题描述
所有的请求只要是涉及到DB的查询都会被block住,感觉你的项目是死了一样了没有效应。
但是info, health, dump倒是可以访问
heap dump 里发现所有的thread 都停在这个方法上面 GenericObjectPool.borrowObject()
解决方法
给BasicDataSource 设置最大值,因为它的默认最大值是8,而这8个db connection被DB health check 和 JMS consumer 起来后用完了。
导致其它的用户请求拿不到DB connection而停在那里等。表现就是所有的请求都没有响应了。
BasicDataSource ds = new BasicDataSource();
**ds.setMaxActive(50);**
用下面代码禁掉DB health check.
management.health.db.enabled=false
问题代码展示
org.apache.commons.dbcp.BasicDataSourceBasicDataSource ds = new BasicDataSource();ds.setDriverClassName(**);ds.setUrl(**);ds.setUsername(**); ds.setPassword(**);
Jms consumer 的配置
<bean id="jmsContainer" class="**"><property name="connectionFactory" ref="**" /><property name="destination" ref="**" /><property name="messageListener" ref="**" /><property name="autoStartup" value="true" /><property name="receiveTimeout" value="5000" /><property name="concurrentConsumers" value="1"/><property name="maxConcurrentConsumers" value="10"/><property name="sessionAcknowledgeMode" value="2"/></bean>
进一步疑问
为什么DB connection 不会放回呢?及时是8个DB connection 也应该会有放回的呀。不会一直到占着不放
答案
因为i我们用 spring 的REQUIRES_NEW做传播事务传播。
JMS consumer -> a 方法 应用默认的事务传播传播 -> b 方法 是应用REQUIRES_NEW作为事务传播的。
所有假设10个JMS consumer 几乎一起起来的话,10个jms consumer 就把8个DB connection用完了。他们都停在调用方法b那里,等待新的DB connection. 然后根本就不会有DB connection 释放。所有都block 住了。
@Transactionalpublic void a(String b)@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)public void b(String b)
[Java] Spring事务REQUIRES_NEW导致项目没有响应-原因DB maxActive没设置相关推荐
- spring 事务持久性_项目学生:Spring数据的持久性
spring 事务持久性 这是Project Student的一部分. 其他职位包括带有Jersey的Webservice Client,带有Jersey的 Webservice Server和业务层 ...
- java spring 事务传播_spring事务传播机制实例讲解
天温习spring的事务处理机制,总结如下 对于SQL事务的概念以及ACID性质,可以参见我的另一篇博文 http://kingj.iteye.com/admin/blogs/1675011 spri ...
- java spring 事务_java 事务与spring 声明式事务
Spring声明式事务让我们从复杂的事务处理中得到解脱.使得我们再也无需要去处理获得连接.关闭连接.事务提交和回滚等这些操作.再也无需要我们在与事务相关的方法中处理大量的try-catch-final ...
- java spring 数据库_JAVA - SpringBoot项目引用MyBatis操作数据库
JAVA - SpringBoot项目引用MyBatis操作数据库 添加POM依赖: org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.1 ...
- JAVA Spring 事务管理事务不回滚问题
Spring事务管理事务不回滚 dao层: @Repository public class UserDaoImpl implements UserDao { @Autowired private J ...
- 排查Spring事务注解不起作用的原因
今天帮同事排查了个Spring事务不起作用的问题,Spring Boot项目,加了事务注解,但是事务不起作用,到底是啥原因导致事务没起作用呢?经过一番排查,终于找到了原因,在此做个记录,以备再用. 事 ...
- java spring事务管理系统_Java Spring-事务管理概述
2017-11-11 23:05:39 事务(Transaction):是逻辑上一组操作,要么全都成功,要么全都失败. 一.事务的特性 原子性:事务不可分割 一致性:事务执行的前后,数据完整性保持一致 ...
- java spring 事务传播_实战Spring事务传播性与隔离性
一.事务传播性 1.1 什么是事务的传播性 事务的传播性一般在事务嵌套时候使用,比如在事务A里面调用了另外一个使用事务的方法,那么这俩个事务是各自作为独立的事务执行提交,还是内层的事务合并到外层的事务 ...
- java spring 事务提交_Spring 事务提交之后再执行操作
Spring代码实现: import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ster ...
最新文章
- Java设计模式之十一 ---- 策略模式和模板方法模式
- Microsoft Visual Studio International Pack 1.0
- android 自启动列表,Android 机型设置自启动的跳转界面
- 12伏的蓄电池有几个单格组成_福建汤浅蓄电池ups电源机房一体化
- 使用 Advanced Installer 打包 一键安装Web应用程序
- Circular buffer
- 腾讯AI又搞出大动作:Robotics X机器人实验室成立,签Nature办新AI大会
- mysql 命令 例子_Mysql 命令实例
- MongoDB笔记(一):MongoDB介绍及Windows下安装
- 二叉树 先序遍历 中序遍历 后续遍历 java实现
- CodeBlocks-20.03下载安装及中文教程
- linux开启远程ssh服务器配置,配置Linux服务器SSH远程密钥登录
- 金蝶服务器显示已离线,金蝶K3提示云服务器已离线
- 08_MySQL的函数
- Elastic Stack
- 2021深圳各中学高考成绩查询,深圳四大高中在2021年高考深一模的前500名分布数据...
- Python v / s PHP:2019年选择哪种编程语言?
- 如把联想电脑计算机图标放在桌面上,联想的电脑应用怎么放到桌面图标-?(图)...
- iOS Code Signing 学习笔记转写
- 三分钟学会网络地址相关计算