`
abear
  • 浏览: 21940 次
社区版块
存档分类
最新评论

【收录】将Spring用于高并发环境的隐忧

阅读更多

将Spring用于高并发环境的隐忧

最近协助一些BEA客户做调优,他们使用了Spring,出现了各种各样的性能问题,这些问题其实都是不容易重现的,其中,我自己捕获了一些ThreadDump,并report了给Spring JIRA。这个Case的情况是:Spring会偶然出现CPU 100%的情况,WebLogic Server崩溃,我后来分析了线程Dump,觉得是一种Lock Contention的情形,幸好,Juergen Hoeller很快给我Fixed了这个Bug:
http://jira.springframework.org/browse/SPR-4664

使用Java编程的同学都建议Review一下,呵呵:

这是2.5.4以前的代码:

/**
* Cache of TransactionAttributes, keyed by DefaultCacheKey (Method + target Class).
* <p>As this base class is not marked Serializable, the cache will be recreated
* after serialization - provided that the concrete subclass is Serializable.
*/
final  Map attributeCache  =   new  HashMap();

/**
* Determine the transaction attribute for this method invocation.
* <p>Defaults to the class's transaction attribute if no method attribute is found.
@param  method the method for the current invocation (never <code>null</code>)
@param  targetClass the target class for this invocation (may be <code>null</code>)
@return  TransactionAttribute for this method, or <code>null</code> if the method
* is not transactional
*/
public  TransactionAttribute getTransactionAttribute(Method method, Class targetClass) {
//  First, see if we have a cached value.
Object cacheKey  =  getCacheKey(method, targetClass);
synchronized  ( this .attributeCache) {
Object cached 
=   this .attributeCache.get(cacheKey);
if  (cached  !=   null ) {
//  Value will either be canonical value indicating there is no transaction attribute,
//  or an actual transaction attribute.
if  (cached  ==  NULL_TRANSACTION_ATTRIBUTE) {
return   null ;
}
else  {
return  (TransactionAttribute) cached;
}
}
else  {
//  We need to work it out.
TransactionAttribute txAtt  =  computeTransactionAttribute(method, targetClass);
//  Put it in the cache.
if  (txAtt  ==   null ) {
this .attributeCache.put(cacheKey, NULL_TRANSACTION_ATTRIBUTE);
}
else  {
if  (logger.isDebugEnabled()) {
logger.debug(
" Adding transactional method [ "   +  method.getName()  +   " ] with attribute [ "   +  txAtt  +   " ] " );
}
this .attributeCache.put(cacheKey, txAtt);
}
return  txAtt;
}
}
}


这是2.5.4 Fixed后的代码:

     /**
     * Cache of TransactionAttributes, keyed by DefaultCacheKey (Method + target Class).
     * <p>As this base class is not marked Serializable, the cache will be recreated
     * after serialization - provided that the concrete subclass is Serializable.
     
*/
    
final  Map attributeCache  =  CollectionFactory.createConcurrentMapIfPossible( 16 );


    
/**
     * Determine the transaction attribute for this method invocation.
     * <p>Defaults to the class's transaction attribute if no method attribute is found.
     * 
@param  method the method for the current invocation (never <code>null</code>)
     * 
@param  targetClass the target class for this invocation (may be <code>null</code>)
     * 
@return  TransactionAttribute for this method, or <code>null</code> if the method
     * is not transactional
     
*/
    
public  TransactionAttribute getTransactionAttribute(Method method, Class targetClass) {
        
//  First, see if we have a cached value.
        Object cacheKey  =  getCacheKey(method, targetClass);
        Object cached 
=   this .attributeCache.get(cacheKey);
        
if  (cached  !=   null ) {
            
//  Value will either be canonical value indicating there is no transaction attribute,
            
//  or an actual transaction attribute.
             if  (cached  ==  NULL_TRANSACTION_ATTRIBUTE) {
                
return   null ;
            }
            
else  {
                
return  (TransactionAttribute) cached;
            }
        }
        
else  {
            
//  We need to work it out.
            TransactionAttribute txAtt  =  computeTransactionAttribute(method, targetClass);
            
//  Put it in the cache.
             if  (txAtt  ==   null ) {
                
this .attributeCache.put(cacheKey, NULL_TRANSACTION_ATTRIBUTE);
            }
            
else  {
                
if  (logger.isDebugEnabled()) {
                    logger.debug(
" Adding transactional method [ "   +  method.getName()  +   " ] with attribute [ "   +  txAtt  +   " ] " );
                }
                
this .attributeCache.put(cacheKey, txAtt);
            }
            
return  txAtt;
        }
    }


但是2.5.4 snapshot是未经很好测试的版本,客户一般不太敢用。
我不知道其实有多少客户真正地把Spring投入到高并发性环境下使用,
如果有,他们应该会能碰到我所碰到的情形。

分享到:
评论

相关推荐

    毕设项目:基于spring+mybatis实现高并发秒杀系统,包含详细笔记.zip

    毕设项目:基于spring+mybatis实现高并发秒杀系统,包含详细笔记 毕设项目:基于spring+mybatis实现高并发秒杀系统,包含详细笔记 毕设项目:基于spring+mybatis实现高并发秒杀系统,包含详细笔记 毕设项目:基于...

    Spring Boot高并发性能优化与微服务架构挑战分析

    内容概要:本文详细分析了Spring Boot在高并发场景下的性能瓶颈和技术挑战,并提出了具体的优化方案。主要讨论了启动性能与资源占用、内存管理与GC性能、高并发场景下的线程池优化、微服务架构中的服务治理与分布式...

    spring+netty+websocket高并发聊天

    总的来说,这个项目展示了如何将 `Spring` 的便捷性、`Netty` 的高性能以及 `WebSocket` 的实时通信能力结合起来,构建一个能够处理高并发聊天需求的应用。通过引入 `RocketMQ`,还可以进一步提升系统的可扩展性和...

    redis缓存spring boot 高并发秒杀商品实战讲解视频

    redis缓存spring boot 高并发秒杀商品实战讲解视频。包括spring mvc ,mybatis ,redis,rabbitMQ消息队列等的整合

    springmvc+spring线程池处理http并发请求数据同步控制问题

    同时,Spring框架提供的线程池功能则可以帮助我们优化多线程环境下的性能,特别是处理并发请求时。在这个主题中,我们将深入探讨如何利用Spring MVC与Spring线程池来有效地管理并发请求,并解决数据同步控制问题。 ...

    spring boot高并发秒杀测试.zip

    redis高并发秒杀测试测试项目https://github.com/14251104246/redis-demo.git准备使用docker-compose启动redis服务器(可以用其他方式命令启动)理念启动测试项目jmeter测试高并发杀-重新超卖问题.jmx高并发秒杀-有...

    sprint boot整合netty5实现高并发websocket,不过netty5官网已经不推荐

    spring boot demo,整合netty5实现高并发websocket,并引入slf4g+lombok,采用maven形式; 直接导入运行,有测试页面也有实现代码及详细注释,src/main/webapps/TestNettyWebSocket.html里第十行改成 ws://localhost...

    (源码)基于Spring Boot的高并发秒杀系统.zip

    系统通过Spring Boot、MyBatis Plus、Redis等技术栈实现高效的数据处理和缓存机制,确保在高并发环境下系统的稳定性和性能。 ## 项目的主要特性和功能 1. Spring Boot应用入口 使用SpringBootApplication注解启动...

    SpringCloud Nginx 高并发核心编程学习文档+整理代码

    学习这个资料,开发者将能够了解如何利用SpringCloud构建微服务架构,以及如何借助Nginx优化高并发环境下的服务性能。通过理论学习与代码实践,可以提升开发者的技能水平,使他们能够在复杂的企业级项目中游刃有余地...

    RestTemplate如何在Spring或非Spring环境下使用.docx

    然而,随着Spring 5的发布,`WebClient`作为非阻塞的Reactive HTTP客户端被引入,它更适合处理高并发和流式数据的场景。尽管如此,`RestTemplate`仍然广泛存在于Spring生态中,特别是在Spring Cloud等项目中,因为很...

    基于springmvc高并发秒杀系统

    技术描述:基于SpringMVC,Spring,MyBatis实现的高并发秒杀系统。代码设计风格基于RESTful,以c3p0作为连接池,Redis数据库为媒介实现高并发技术。其中,对于相关的DAO,Service操作,均添加了Junit单元测试实例。 ...

    基于Spring Boo+Mybatis+Redis+RabbitMQ设计的高并发电商秒杀系统

    基于Spring Boo+Mybatis+Redis+RabbitMQ设计的高并发电商秒杀系统基于Spring Boo+Mybatis+Redis+RabbitMQ设计的高并发电商秒杀系统基于Spring Boo+Mybatis+Redis+RabbitMQ设计的高并发电商秒杀系统基于Spring Boo+...

    基于Spring Boot的高并发秒杀系统.zip

    本项目是一个基于Spring Boot的高并发秒杀系统,集成了MyBatis Plus、Redis、RabbitMQ等技术,旨在提供一个高效、稳定的秒杀解决方案。系统涵盖了用户管理、商品管理、订单管理、秒杀活动管理等多个模块,通过前后端...

    《Spring Cloud与Docker高并发微服务架构设计实施》.zip

    书中通过一个互联网电商平台实例实现了高并发的微服务架构设计,并通过详细的开发和实施过程,演示了构建一个安全可靠、稳定高效并可持续扩展的系统平台的方法。本书适合互联网应用开发设计人员参考学习

    spring boot高并发下耗时操作的实现方法

    spring boot高并发下耗时操作的实现方法 异步处理和高并发 在高并发场景下,服务器需要处理大量的请求,这时如果采用传统的同步处理方式,可能会导致服务器线程资源耗尽,导致服务器崩溃。因此,需要采用异步处理...

    基于spring+mybatis实现高并发秒杀系统源码+项目说明(包含详细笔记)(高分毕设).zip

    【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、...基于spring+mybatis实现高并发秒杀系统源码+项目说明(包含详细笔记)(高分毕设).zip

    基于Spring Boot框架的高并发秒杀系统.zip

    基于Spring Boot框架的高并发秒杀系统 项目简介 本项目是一个基于Spring Boot框架的高并发秒杀系统,旨在处理大量用户同时请求的场景。系统集成了多种技术栈,包括前端技术(Thymeleaf、jQuery、Bootstrap)、...

    (源码)基于Spring Boot和Spring Cloud的高并发电商秒杀系统.zip

    # 基于Spring Boot和Spring Cloud的高并发电商秒杀系统 ## 项目简介 本项目是一个高可用、高并发的电商秒杀系统,基于Spring Boot和Spring Cloud框架构建。系统旨在处理大量用户同时访问的场景,确保系统的稳定性...

    Spring cloud与docker高并发微服务架构设计实施(试读)

    6. **容错机制**:通过集成Spring Cloud Sleuth、Zipkin等组件,可以实现服务调用的链路追踪,这对于诊断高并发环境下的系统故障非常有帮助。 #### 四、总结 Spring Cloud与Docker相结合,在高并发微服务架构设计...

Global site tag (gtag.js) - Google Analytics