最近协助一些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实现高并发秒杀系统,包含详细笔记 毕设项目:基于spring+mybatis实现高并发秒杀系统,包含详细笔记 毕设项目:基于spring+mybatis实现高并发秒杀系统,包含详细笔记 毕设项目:基于...
内容概要:本文详细分析了Spring Boot在高并发场景下的性能瓶颈和技术挑战,并提出了具体的优化方案。主要讨论了启动性能与资源占用、内存管理与GC性能、高并发场景下的线程池优化、微服务架构中的服务治理与分布式...
总的来说,这个项目展示了如何将 `Spring` 的便捷性、`Netty` 的高性能以及 `WebSocket` 的实时通信能力结合起来,构建一个能够处理高并发聊天需求的应用。通过引入 `RocketMQ`,还可以进一步提升系统的可扩展性和...
redis缓存spring boot 高并发秒杀商品实战讲解视频。包括spring mvc ,mybatis ,redis,rabbitMQ消息队列等的整合
同时,Spring框架提供的线程池功能则可以帮助我们优化多线程环境下的性能,特别是处理并发请求时。在这个主题中,我们将深入探讨如何利用Spring MVC与Spring线程池来有效地管理并发请求,并解决数据同步控制问题。 ...
redis高并发秒杀测试测试项目https://github.com/14251104246/redis-demo.git准备使用docker-compose启动redis服务器(可以用其他方式命令启动)理念启动测试项目jmeter测试高并发杀-重新超卖问题.jmx高并发秒杀-有...
spring boot demo,整合netty5实现高并发websocket,并引入slf4g+lombok,采用maven形式; 直接导入运行,有测试页面也有实现代码及详细注释,src/main/webapps/TestNettyWebSocket.html里第十行改成 ws://localhost...
系统通过Spring Boot、MyBatis Plus、Redis等技术栈实现高效的数据处理和缓存机制,确保在高并发环境下系统的稳定性和性能。 ## 项目的主要特性和功能 1. Spring Boot应用入口 使用SpringBootApplication注解启动...
学习这个资料,开发者将能够了解如何利用SpringCloud构建微服务架构,以及如何借助Nginx优化高并发环境下的服务性能。通过理论学习与代码实践,可以提升开发者的技能水平,使他们能够在复杂的企业级项目中游刃有余地...
然而,随着Spring 5的发布,`WebClient`作为非阻塞的Reactive HTTP客户端被引入,它更适合处理高并发和流式数据的场景。尽管如此,`RestTemplate`仍然广泛存在于Spring生态中,特别是在Spring Cloud等项目中,因为很...
技术描述:基于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+...
本项目是一个基于Spring Boot的高并发秒杀系统,集成了MyBatis Plus、Redis、RabbitMQ等技术,旨在提供一个高效、稳定的秒杀解决方案。系统涵盖了用户管理、商品管理、订单管理、秒杀活动管理等多个模块,通过前后端...
书中通过一个互联网电商平台实例实现了高并发的微服务架构设计,并通过详细的开发和实施过程,演示了构建一个安全可靠、稳定高效并可持续扩展的系统平台的方法。本书适合互联网应用开发设计人员参考学习
spring boot高并发下耗时操作的实现方法 异步处理和高并发 在高并发场景下,服务器需要处理大量的请求,这时如果采用传统的同步处理方式,可能会导致服务器线程资源耗尽,导致服务器崩溃。因此,需要采用异步处理...
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、...基于spring+mybatis实现高并发秒杀系统源码+项目说明(包含详细笔记)(高分毕设).zip
基于Spring Boot框架的高并发秒杀系统 项目简介 本项目是一个基于Spring Boot框架的高并发秒杀系统,旨在处理大量用户同时请求的场景。系统集成了多种技术栈,包括前端技术(Thymeleaf、jQuery、Bootstrap)、...
# 基于Spring Boot和Spring Cloud的高并发电商秒杀系统 ## 项目简介 本项目是一个高可用、高并发的电商秒杀系统,基于Spring Boot和Spring Cloud框架构建。系统旨在处理大量用户同时访问的场景,确保系统的稳定性...
6. **容错机制**:通过集成Spring Cloud Sleuth、Zipkin等组件,可以实现服务调用的链路追踪,这对于诊断高并发环境下的系统故障非常有帮助。 #### 四、总结 Spring Cloud与Docker相结合,在高并发微服务架构设计...