环境

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没设置相关推荐

  1. spring 事务持久性_项目学生:Spring数据的持久性

    spring 事务持久性 这是Project Student的一部分. 其他职位包括带有Jersey的Webservice Client,带有Jersey的 Webservice Server和业务层 ...

  2. java spring 事务传播_spring事务传播机制实例讲解

    天温习spring的事务处理机制,总结如下 对于SQL事务的概念以及ACID性质,可以参见我的另一篇博文 http://kingj.iteye.com/admin/blogs/1675011 spri ...

  3. java spring 事务_java 事务与spring 声明式事务

    Spring声明式事务让我们从复杂的事务处理中得到解脱.使得我们再也无需要去处理获得连接.关闭连接.事务提交和回滚等这些操作.再也无需要我们在与事务相关的方法中处理大量的try-catch-final ...

  4. java spring 数据库_JAVA - SpringBoot项目引用MyBatis操作数据库

    JAVA - SpringBoot项目引用MyBatis操作数据库 添加POM依赖: org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.1 ...

  5. JAVA Spring 事务管理事务不回滚问题

    Spring事务管理事务不回滚 dao层: @Repository public class UserDaoImpl implements UserDao { @Autowired private J ...

  6. 排查Spring事务注解不起作用的原因

    今天帮同事排查了个Spring事务不起作用的问题,Spring Boot项目,加了事务注解,但是事务不起作用,到底是啥原因导致事务没起作用呢?经过一番排查,终于找到了原因,在此做个记录,以备再用. 事 ...

  7. java spring事务管理系统_Java Spring-事务管理概述

    2017-11-11 23:05:39 事务(Transaction):是逻辑上一组操作,要么全都成功,要么全都失败. 一.事务的特性 原子性:事务不可分割 一致性:事务执行的前后,数据完整性保持一致 ...

  8. java spring 事务传播_实战Spring事务传播性与隔离性

    一.事务传播性 1.1 什么是事务的传播性 事务的传播性一般在事务嵌套时候使用,比如在事务A里面调用了另外一个使用事务的方法,那么这俩个事务是各自作为独立的事务执行提交,还是内层的事务合并到外层的事务 ...

  9. java spring 事务提交_Spring 事务提交之后再执行操作

    Spring代码实现: import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ster ...

最新文章

  1. Java设计模式之十一 ---- 策略模式和模板方法模式
  2. Microsoft Visual Studio International Pack 1.0
  3. android 自启动列表,Android 机型设置自启动的跳转界面
  4. 12伏的蓄电池有几个单格组成_福建汤浅蓄电池ups电源机房一体化
  5. 使用 Advanced Installer 打包 一键安装Web应用程序
  6. Circular buffer
  7. 腾讯AI又搞出大动作:Robotics X机器人实验室成立,签Nature办新AI大会
  8. mysql 命令 例子_Mysql 命令实例
  9. MongoDB笔记(一):MongoDB介绍及Windows下安装
  10. 二叉树 先序遍历 中序遍历 后续遍历 java实现
  11. CodeBlocks-20.03下载安装及中文教程
  12. linux开启远程ssh服务器配置,配置Linux服务器SSH远程密钥登录
  13. 金蝶服务器显示已离线,金蝶K3提示云服务器已离线
  14. 08_MySQL的函数
  15. Elastic Stack
  16. 2021深圳各中学高考成绩查询,深圳四大高中在2021年高考深一模的前500名分布数据...
  17. Python v / s PHP:2019年选择哪种编程语言?
  18. 如把联想电脑计算机图标放在桌面上,联想的电脑应用怎么放到桌面图标-?(图)...
  19. iOS Code Signing 学习笔记转写
  20. 三分钟学会网络地址相关计算

热门文章

  1. 学习hashtable,处理“海量”数据
  2. JDK Executor执行器的应用
  3. silverlightLogo动画
  4. JavaScript 设计模式核⼼原理与应⽤实践 之 结构型设计模式
  5. TCP UDP的区别
  6. 结构设计模式 - Bridge设计模式
  7. MySQL抽稀_python安装mysql的依赖包mysql-python操作
  8. Android Picasso最详细的使用指南
  9. WPF 不支持从调度程序线程以外的线程对其 SourceCollection 进行的更改
  10. 基于deepin-wine的windows软件打包deb安装包教程