在评价一个系统的时候,性能指标是很重要的,那么在当前J2EE的系统开发当中,如何来提高系统的性能呢?我觉得应该从对象管理入手,从对象的生命周期开始。虽然大家可能会说,Java有垃圾收集器,我们的对象的生命周期不需要我们自己管理,但是如果要是真的过分依赖java语言本身的特性,那么我相信,系统的性能肯定好不到哪去。所以,下面就主要从三个方面入手来说一下我的想法。
第一:容器化系统功能性组件
在每个系统中,我想都会存在功能性的组件,比如当前开发当中的service,这些功能性的服务一般来说都是没有状态的,是可以多用户共享的,这种共享的服务对象,我们也需要将其进行统一的管理,幸运的是目前已经存在很多这样的管理功能性服务的框架或者容器,比如目前比较流行的各种IOC容器,或者是重量级的EJB容器,它们都提供了对系统中各种服务组件的管理。
第二:缓存化业务对象
在说缓存之前,我不得不说一下面向对象的设计,可能有些人认为,为什么缓存会与面向对象的设计扯上关系,其实这就是缓存的关键。首先设想一下,如果开发系统的过程中,都是采用面向过程,面向数据库的思维编程,每一次业务操作,我们都是调用通过数据库操作来完成,这其实就是POEAA中的事务脚本,只适合一些简单的系统的开发,或者一个项目中,比较简单模块的开发,对于复杂的模块,更好的方式就是采用面向对象的方法来进行开发。
好了,说到了面向对象的设计问题,至于这个问题已经有很多书籍以及很多人讨论了很多年了,就我个人来说,我觉得采用DDD建模是目前比较适合的一种方式。DDD中涉及到得每种模式或者说是每一种模型元素对于缓存设计来说都是很重要的,下面我说说我的想法:
首先我说一下关于聚合的问题,为什么说聚合对于缓存非常重要呢?这其实涉及到了一种控制访问的问题,一个聚合根控制了对整个聚合的访问,要想访问聚合里的对象必须要通过聚合的根。
好了,我们以一个实例来说话,比如一个论坛的设计,论坛中有Forum以及ForumState对象,Forum对象是聚合的根,是一个实体模型,而ForumState是一个值对象,并且是属于Forum这个聚合根的子对象,我们把ForumState对象从Forum对象分离出来,好处主要有两个,从事务的角度来说,当我们更新ForumState对象的时候,不用锁住Forum对象,从缓存设计的角度来说,当我们更新ForumState对象的时候不用刷新Forum对象的缓存,因为Forum不是经常改变的,所以不必要因为经常改变属性的改变而改变。那么具体怎么来设计呢?我们可以这样做,在ForumState对象中设置一个状态位,表示它的状态是否已经改变,当Forum状态发生改变,比如有人创建新的帖子或者回复了帖子后,我们可以设置这个状态位为true,表示状态已经改变,这样当再次从缓存中取得Forum时,查看状态位,如果发现已经变化了,那么就重新从数据库加载ForumState。当然要想达到这种效果,我们一定要设计好聚合,所有对子对象的访问都要通过聚合的根,比如所有对ForumState对象的访问都要经过Forum对象,并且要保证所有的数据库操作,都首先从统一的缓冲入口进行,这样保证了整个系统中用的是同一个缓存,大家操作的所有对象都是同一个缓存中的对象。所以这里也给出了一条对象设计的提示,将经常变化的熟悉和不经常变化的属性分开,并且将经常变化的属性独立出去,作为聚合根的 一个子对象,这样做到变和不变分离,不仅有利于高内聚,而且有利于事务的控制和缓存的更新。
<!--EndFragment-->
上面是关于Repository在对象建模中的作用,下面我也说说关于工厂的作用,既然是工厂,那么它肯定要生产东西出来,但是它不能随便乱生产,它生产出来的应该是整个聚合的根,并且要保证这个聚合的不变量受到保护,这样通过工厂提供一个集中的模型创建的访问点,也方便了控制访问。要设计一个好的工厂,我们首先需要设计一个好的对象模型,分辨出合理的聚合,这样工厂才会发挥真正的效力。
最后既然说到了缓存,还有一点需要注意,那就是这个缓存的范围,我这里说的缓存是全局的缓存,是一个application级别的缓存。我个人是比较反对在Httpsession中保存大量数据的,这样当用户增多的情况下,比如会浪费很多的内存,浪费性能。所以我们更应该需要的是全局的缓存,这样底层的缓冲框架我们还可以采用分布式的缓存系统,这样以来我们的系统在集群环境下也免去了一些session failover的开销。这其实也是一种SNA架构的思想。
第三:数据库系统优化
数据库在我们大多数的系统开发中都会涉及到,这方面的优化,主要是基于一些索引等的优化。
最后,我想说的就是我们应该尽量采用一种面向对象的方式来开发我们的系统,而不是过分的依赖数据库来编程,在系统开发当中,我们操作具体的模型对象,而我们的模型对象由存储在缓存中,尽量减少对数据库的访问操作,从而提升系统的性能。
总结上面所述,要想提高系统的性能,我们面临的难题就是对象建模,只有我们针对自己的具体的业务有了合理的对象模型后,我们才能有针对性的对业务对象进行缓存,从而使得缓存的效果最大化,提高系统的性能。
<!--EndFragment-->
分享到:
相关推荐
电力拖动自动控制系统运动控制系统课后思考题习题答案 本资源为电力拖动自动控制系统运动控制系统课后思考题习题答案,涵盖了电力拖动自动控制系统运动控制系统的主要知识点,包括直流电动机的调速方法、直流PWM...
航空订票系统性能方案(手写完整版) 航空订票系统性能方案是 LR 自带航空订票系统的性能方案,旨在指导航空订票系统的测试。该方案对航空订票网站系统的性能测试进行了详细的规划和设计。 航空订票系统的主要功能...
在进行系统性能测试时,通常会依据一套既定的框架来组织测试报告,这份XX系统的性能测试报告即是按照这样的框架来展开的。下面将基于报告内容,详细解释系统性能测试中需要考虑的关键点。 首先,测试目的清晰地指出...
在自动控制系统设计中,系统性能的评估至关重要,主要包括稳定性、动态性能和稳态性能三个方面。稳定性是控制系统的基础,它衡量的是系统在受到扰动后能否自行恢复到平衡状态。一个稳定的系统,其闭环特征方程的所有...
- **测试结果:** 在长时间运行后的系统性能指标。 - **结果分析:** 分析稳定性测试的结果,评估系统长期运行下的可靠性和性能下降情况。 **5.4 EOD 批处理测试** - **日常批处理:** 日常需要进行的批量处理任务...
### 性能测试中的核心知识点解析 #### 一、系统吞吐量的理解 - **定义**: 系统吞吐量是指单位时间内系统...这些知识点对于理解和优化系统的性能至关重要,有助于开发者和测试人员更好地评估和提升系统的性能表现。
电力拖动自动控制系统是...总的来说,电力拖动自动控制系统的分析和设计涉及电动机的电气特性、控制策略、反馈机制等多个方面,需要深入理解电动机的工作原理以及自动控制理论,以便有效地实现系统的调速和性能优化。
### Web应用系统性能测试 #### 一、引言与背景 随着互联网技术的快速发展和企业信息化建设的深入,Web应用已成为现代企业业务运作的核心部分。然而,随着Web应用的广泛使用,用户数量激增和数据量剧增的问题也日益...
软件系统性能的常见指标 软件系统性能的常见指标是衡量软件系统性能的重要指标,它们可以帮助我们了解软件系统的运行状况,查找性能瓶颈,并优化系统性能。下面是常见的软件系统性能指标: 1. 响应时间(Response ...
《关于Go性能优化的思考》这本书提供了许多关于如何编写高效Go代码的策略和技巧。本文将深入探讨这些最佳实践,帮助开发者提升程序性能。 1. **内存管理与垃圾回收** Go语言采用自动垃圾回收机制,但在某些场景下...
【啤酒游戏】是一种模拟供应链管理的互动教学工具,旨在揭示系统思考的重要性。在这个游戏中,参与者分别扮演制造商、批发商和零售商的角色,通过订单和交货进行互动,模拟真实市场环境中的供求关系。游戏的设计旨在...
- **结果评估标准**:测试结果需满足预设的系统性能需求。 **结果评估**: 1. **响应时间**:通过测试收集的数据,分析平均响应时间是否在10秒以内,以验证系统在高并发下的处理速度。 2. **资源利用率**:监控...
【Web应用系统性能测试】是确保系统稳定性和用户体验的关键步骤。在进行性能测试时,我们需要考虑多种因素,包括但不限于Web服务器配置、FTP服务、日志服务器以及邮件中继服务等。性能测试的目标是评估系统在高负载...
性能测试模型,如PV计算模型、PV->TPS转换模型、TPS波动模型以及共享中心性能测试模型和前端页面性能测试模型,都是为了更准确地模拟和预测系统性能而构建的。这些模型有助于测试人员深入理解系统行为,并以此为基础...
LiteOS 是一个轻量级的嵌入式操作系统,具有低功耗、低成本和高性能的特点。 二、国产嵌入式操作系统的挑战 国产嵌入式操作系统面临着许多挑战,例如技术门槛高、人才缺乏、市场竞争激烈等。同时,国产嵌入式操作...
系统分析是系统工程的核心,它包括问题定义、模型建立、方案评估和决策制定等步骤,旨在优化系统性能。 第四章关注系统模型的特性,如解释结构模型,它用于表示系统元素之间的因果关系。模型化是理解和预测系统行为...