InfoQ

新闻

Spring应用性能调优

作者 Ian Roughley 译者 宋玮 发布于 2007年11月29日 上午1时50分

社区
Architecture,
Java
主题
开放源代码,
性能和可伸缩性,
企业架构
在来自SpringSource的一份新白皮书中,Adrian Colyer说明了Spring所提供的运行时环境。
Spring编程和配置模型已经得到很好的理解并有大量的文档,而且被全球数十万开发者所使用。这个白皮书是为管理Spring应用程序的运营团队而写的。
白皮书的第一部分回顾了Spring内核的核心职责,它们是:
  • 引导程序 —— 创建应用程序上下文,它为应用程序提供运行时上下文。
  • 决定组件配置 —— 决定哪些应用组件需要被创建、它们是怎样被配置的、以及它们需要什么样的支持服务。这个步骤也就是大家所熟知的蓝图(blueprint)阶段,这时决定了服务准备情况。
  • 实例化、配置及装配 —— 使用蓝图,组件现在可以在需要的时候被构造。这一阶段极为重要,因为Spring需要需要考虑组件间的依赖、特定顺序、以及构造机制。这一阶段的失败将导致应用程序不可操作。
  • 组件后处理(Post Processing) —— 调用被Spring企业级服务和用户服务器注册为后处理器的组件。
  • 装饰 —— 当使用AOP命名空间或标注类将横切组件行为描述、声明为aspect时,Spring内核就有了额外的任务。所描述的切入点(pointcut)需要被许可,并为原始组件产生一个代理,以便用额外的功能装饰该组件。
  • 管理组件生命周期和范围 —— 由于组件可能有不同的生命周期和范围,Spring内核将持续监视创建、重用和销毁组件。
白皮书中更有趣的部分涉及Spring应用程序性能调优。象其他任何应用程序一样,首先建议使用如Apache JMeter、Selenium、JAMon或利用Spring AOP或AspectJ aspect去测量一下性能。
于是最优化归结为两类:建立一个有效的蓝图(调优你的配置)、有效使用运行时设施(使你的应用设计最优化)。从一个干净且清晰的设计开始,充分利用Spring提供的设施,只在数据显示确实有好处的地方才无需遵循这一点。
建立一个有效的蓝图
为了建立一个有效蓝图,你需要利用你的部署平台,让环境依赖脱离Spring配置。当声明数据库连接和JMS连接时这一点尤为重要,那些利用JNDI的地方能使你充分利用你的部署平台设施。白皮书所提供的其他建议是:
Spring的PropertyPlaceholderConfigurer非常适合将那些可能需要由运营团队修改的配置设定外部化。
而且
这里一个好的技巧是使用Spring的JMX输出(export)能力来定义一个MBean,它通过JMX来暴露所有配置值。这使你能够连接到一个正在运行的应用程序上,并很容易看到它当前正在使用的配置值。
利用运行时最优化
许多产品运行时的性能问题都会被跟踪至持久层,拥有正确优化过的数据库和数据访问层是极其重要的。
  • 争取在eager和lazy装载策略之间找到恰当的平衡点
  • 在log中显示出SQL语句
  • 对于批量操作、大批更新或插入、以及存储过程,通常最好使用JDBC(通过Spring JDBC)而非ORM工具
  • 充分利用你的数据库所提供的特性
  • 如果你有一个包含完整持久性逻辑(并非业务逻辑)的操作,考虑将它作为存储过程移到数据库中,并通过Spring JDBC来调用
  • 只读引用数据可以被保持在内存缓存中
性能调优章节的结尾是从SpringSource的一些顾问那儿搜集的其他调优和最优化技巧的汇总:
  • Spring Batch项目中支持的重试可以用来重试失败的操作(例如,在Oracle RAC中,一个在某一簇节点上已经失败的操作)。通过减少传播到最终用户失败的数量,可以减轻运营负担。
  • 不要低估Web内容展现的开销。你应该明确地在事务之外做这项工作。
  • 不要每次请求都实例化应用程序上下文(它是团队移植遗留应用到Spring上时不时会碰到的错误)。
  • 对可以在后台运行的任务,考虑使用Spring的异步任务执行器来减少用户等待时间。
  • 选择合适的远程协议。如果你不需要SOAP的互通性,一个简单方案(如Spring的HttpInvoker支持)将更快更简单。
  • 对影响大部分应用程序的aspect,考虑使用AspectJ代替Spring AOP。
完整的白皮书可以从SpringSource下载。

查看英文原文:Performance Tuning Spring Applications

白皮书下载: 发表人 Fan Feng 发表于 2007年11月29日 上午2时50分
  1. 返回顶部

    白皮书下载:

    2007年11月29日 上午2时50分 发表人 Fan Feng

深度内容

模块化Java:声明式模块化

本文是模块化Java系列文章的第4篇,介绍的是声明式模块化。文中描述了组件如何以声明的方式来定义并组织在一起,而无需让代码依赖于OSGI API。

Ian Robinson和Jim Webber谈论基于Web的整合

本采访是在伦敦举行的QCon2009上记录的,Ian Robinson和Jim Webber探讨了如何将Web作为整合平台以及REST在理论上和实践中的好处。

项目管理修炼之道(精选版)

项目管理对于项目成败至关重要,但实践中每个项目都有自己的独特性,没有现成的解决方案可以套用。书中从应对实际风险的角度出发,讲述了从项目启动、项目规划到项目结束的整个管理流程,展示了作者的思考过程。本迷你书从原书中精选出5个章节。

那是鸟,还是飞机?不,那是超人!

在这个演讲中,Fred将会揭示敏捷的一些外在因素,并会重点关注敏捷获得成功的内在原因。从案例研究和真实的项目经验来看,Fred认为:工具、管理体系都不能让你变得敏捷。敏捷的成功,植根于士气高涨、充分授权的工作者身上,他们能够以不同以往的方式思考问题。

访谈和书摘:Eben Hewitt的新书《Java SOA Cookbook》

Java SOA Cookbook

Eben Hewitt的新书《Java SOA Cookbook》从Java实现的角度讨论了面向服务架构。Eben在书中讨论了SOA基础、工具、最佳实践和SOA治理等主题。

Mark Richard的《Java消息服务》第二版

Mark Richards的新书《Java消息服务》第二版覆盖了JMS的许多主题, 包括发布和订阅模式以及点对点模式,消息过滤和事务等。InfoQ与Mark谈论了跟他的新作。

模块化Java:动态模块化

本文是“模块化Java”系列文章的第三篇,讨论动态模块化,内容涉及如何解析bundle类、bundle如何变化、以及bundle之间如何通信。

让测试也敏捷起来

对于测试组织来说,敏捷方法带来的快速迭代却让测试本身变得困难起来:缺乏“足够详细的文档”,缺乏“仔细设计用例的时间”等等。在本演讲中,段念将与大家探讨如何在敏捷过程中进行测试。