写点什么

Spring 应用性能调优

  • 2007-11-29
  • 本文字数:1581 字

    阅读完需:约 5 分钟

在来自 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

2007-11-29 01:503612
用户头像

发布了 150 篇内容, 共 52.7 次阅读, 收获喜欢 10 次。

关注

评论

发布
暂无评论
发现更多内容

架构训练营毕业总结

apple

模块七作业

bob

「架构实战营」

DDD领域驱动设计落地实践系列

慕枫技术笔记

内容合集 签约计划第二季

架构实战营 - 毕业总结

Alex.Wu

架构实战训练营-模块1-作业

温安适

「架构实战营」

对研发管理的一些思考

hackstoic

研发管理 规范

设计电商秒杀系统

白开水又一杯

#架构实战营

MySQL探秘(五):InnoDB锁的类型和状态查询

程序员历小冰

MySQL 28天写作 12月日更

如何实现单体架构到微服务架构的蜕变?

看山

微服务架构 单体架构 签约计划第二季

极限数据 v0.2 版本正式发布了

极限实验室

elastic console Elastic Search 极限数据平台 ES多集群管理

微服务架构指南

看山

微服务架构 内容合集 签约计划第二季 技术专题合集

专注的力量

卢卡多多

28天写作

聊聊工作界面

Justin

工作效率 沟通 28天写作 沟通界面

在线JSON在线对比差异工具

入门小站

工具

拆分电商系统为微服务

deng

架构实战营

MySQL 配置文件 my.cnf / my.ini 逐行详解

蒋川

MySQL 数据库

毕业设计

Li. Mr

【LeetCode】从英文中重建数字Java题解

Albert

算法 LeetCode 12月日更

除了微服务,我们还有其他选择吗?

看山

容器 微服务架构 无服务器云函数 SOA 签约计划第二季

电商业务服务拆分

小麦🌾

架构实战营

架构4期模块一作业

曾竞超

架构实战营

第四模块

Li. Mr

架构实战营第4期--模块一作业

烈火干柴烛灭田边残月

架构实战营

公司的电脑总是卡顿——因为缺少工程师文化

大龄程序员老羊

CTO 工程师文化 互联网创业

系统化思维 VS 场景化思维

Ian哥

思维模式 系统性思维 场景化思维

[Pulsar] 消息从Broker到Consumer的历程

Zike Yang

Apache Pulsar 12月日更

工程师文化:BAT 为什么不喊老板

大龄程序员老羊

CTO 工程师文化 互联网创业

毕业设计项目:设计电商秒杀系统

apple

Java 面向对象精讲【中】

XiaoLin_Java

面向对象 死磕 Java 基础 12月日更

对比 volatile vs synchornized

悟空聊架构

volatile 28天写作 悟空聊架构 12月日更

第八模块

Li. Mr

Spring应用性能调优_Java_Ian Roughley_InfoQ精选文章