返回顶部
首页 > 资讯 > 精选 >12个最重要的J2EE最佳实践(2)
  • 107
分享到

12个最重要的J2EE最佳实践(2)

2023-06-03 07:06:00 107人浏览 独家记忆
摘要

12个最重要的J2EE最佳实践(2)[@more@]7. 使用无状态会话 bean,而不是有状态会话 bean这样做可以使您的系统经得起错误的终止。使用 httpsession 存储和用户相关的状态。 以我们的观点看来,有状态会话 bean

12个最重要的J2EE最佳实践(2)

[@more@]7. 使用无状态会话 bean,而不是有状态会话 bean
这样做可以使您的系统经得起错误的终止。使用 httpsession 存储和用户相关的状态。

以我们的观点看来,有状态会话 bean 的概念已经过时了。如果您仔细对其考虑一下,一个有状态会话 bean 实际上与一个 CORBA 对象在体系结构上是完全相同的,无非就是一个对象实例,绑定到一个服务器,并且依赖于服务器来管理其生命周期。如果服务器关闭了,这种对象也就不存在,那么这个 bean 的客户端的信息也就不存在。

J2EE 应用服务器为有状态会话 bean 提供的故障转移(failover)能够解决一些问题,但是有状态的解决方案没有无状态的解决方案易于扩展。例如,在 WEBSphere Application Server 中,对无状态会话 bean 的请求,是通过对部署无状态会话的成员集群进行平衡加载来实现。相反地,J2EE 应用服务器不能对有状态 bean 的请求进行平衡加载。这意味着您的集群中的服务器的加载过程会是不均衡的。此外,使用有状态会话 bean 将会再添加一些状态到您的应用服务器上,这也是不好的做法。这样就增加了系统的复杂性,并且在出现故障的情况下使问题变得复杂化。创建健壮的分布式系统的一个关键原则是尽量使用无状态行为。

因此,我们建议对大多数应用程序使用无状态会话 bean 方法。任何在处理时需要使用的与用户相关的状态应该以参数的形式传送到 EJB 的方法中(并且通过使用一种机制如 HttpSession 来存储它)或者从持久性的后端存储(例如通过使用实体 bean)作为 EJB 事务的一部分来进行检索。在合适的情况下,这个信息可以缓存到内存中,但是要注意在分布式的环境中保存这种缓存所潜在的挑战性。缓存非常适合于只读数据。

总之,您要确保从一开始就要考虑到可伸展性。检查设计中的所有设想,并且考虑到当您的应用程序要在多个服务器上运行时,是否也可以正常运行。这个规则不但适合上述情况的应用程序代码,也适用于如 MBean 和其他管理界面的情况下。

避免使用有状态性不只是对 IBM/WebSphere 的建议,这是一个基本的 J2EE 设计原则。

8. 使用容器管理的事务

学习一下 J2EE 中的两阶段提交事务,并且使用这种方式,而不是开放您自己的事务管理。容器在事务优化方面几乎总是比较好的。

使用容器管理的事务(CMT)提供了两个关键的优势(如果没有容器支持这几乎是不可能的):可组合的工作单元和健壮的事务行为。

如果您的应用程序代码显式地使用了开始和结束事务(也许使用 javax.jts.UserTransaction 或者甚至是本地资源事务),而将来的要求需要组合模块(也许会是代码重构的一部分),这种情况下往往需要改变事务代码。例如,如果模块 A 开始了一个数据库事务,更新数据库,随后提交事务,并且有模块 B 做出同样的处理,请考虑一下当您在模块 C 中尝试使用上述两个模块,会出现什么情况呢?现在,模块 C 正在执行一个逻辑动作,而这个动作实际上将调用两个独立的事务。如果模块 B 在执行中失败了,而模块 A 的事务仍然能被提交。这是我们所不希望出现的行为。如果,相反地,模块 A 和模块 B 都使用 CMT 的话,模块 C 也可以开始一个 CMT(通常通过配置描述符),并且在模块 A 和模块 B 中的事务将是同一个事务的隐含部分,这样就不再需要复杂的重写代码的工作了。

如果您的应用程序在同一个操作中需要访问多种资源,您就要使用两阶段提交事务。例如,如果从 JMS 队列中删除一个消息,并且随后更新基于这条消息的纪录,这时,要保证这两个操作都会执行或都不会执行就变得尤为重要。如果一条消息已经从队列中被删除,而系统没有更新与此消息相关的数据库中的纪录,那么这种系统是不稳定的。一些严重的客户及商业纠纷源自不一致的状态。

我们时常看到一些客户应用程序试图实现他们自己的解决方案。也许会通过应用程序的代码在数据库更新失败的时候 "撤销"对队列的操作。我们不提倡这样做。这种实现要比您最初的想象要复杂得多,并且还有许多其他的情况(想象一下如果应用程序在执行此操作的过程中突然崩溃的情况)。作为替代的方式,应该使用两阶段提交事务。如果您使用 CMT,并且在一个单一的 CMT 中访问两阶段提交的资源(例如 JMS 和大多数数据库),WebSphere 将会处理所有的复杂工作。它将确保整个事务被执行或者都不被执行,包括系统崩溃、数据库崩溃或其他的情况。其实现在事务日志中保存着事务状态。当应用程序访问多种资源的时候,我们怎么强调使用 CMT 事务的必要性都不为过。

9. 将 JSP 作为表示层的首选

只有在需要多种表示输出类型,并且输出类型被一个单一的控制器及后端支持时才使用 XML/XSLT。

我们常听到一些争论说,为什么您选择 XML/XSLT 而不是 jsP 作为表示层技术。选择 XML/XSLT 的人的观点是,JSP" 允许您将模型和视图混合在一起",而 XML/XSLT 不会有这种问题。遗憾的是,这种观点并不完全正确,或者至少不像白与黑那样分的清楚。实际上,XSL 和 XPath 是编程语言。XSL 是图灵完成的(Turing-complete),尽管它不符合大多数人定义的编程语言,因为它是基于规则的,并且不具备程序员习惯的控制工具

现在的问题是既然给予了这种灵活性,开发人员就会利用这种灵活性。尽管每个人都认同 JSP 使开发人员容易在视图中加入"类似模型"的行为,而实际上,在 XSL 中也有可能做出一些同样的事情。尽管从 XSL 中进行访问数据库这样的事情会非常困难,但是我们曾经见到过一些异常复杂的 XSLT 样式表执行复杂的转换,这实际上是模型代码。

然而,应该选择 JSP 作为首选的表示技术的最基本的原因是,JSP 是现在支持最广泛的、也是最被广泛理解的 J2EE 视图技术。而随着自定义标记库、JSTL 和 JSP2.0 的新特性的引入,创建 JSP 变得更加容易,并且不需要任何 Java 代码,以及可以将模型和视图清晰的分离开。在一些开发环境中(如 WebSphere Studio)加入了对 JSP(包括对调试的支持)的强大支持,并且许多开发人员发现使用 JSP 进行开发要比使用 XLS 简单,一些支持 JSP 的图形设计工具及其他特征(尤其在 JSF 这样的框架下)使得开发人员可以以所见即所得的方式进行 JSP 的开发,而对于 XSL 有时不容易做到。

最后一个要谨慎考虑使用 JSP 的原因是速度问题。在 IBM 所作的对比 XSL 和 JSP 相对速度的性能测试显示:在大多数情况下,JSP 在生成同样的 html 的时候,要比 XSL 快好几倍,甚至使用编译过的 XSL 也是如此。尽管多数情况下这不是问题,但在性能要求很高的情况下,这就会成为问题。

然而,这也不能说,您永远也不要使用 XSL。在一些情况下,XSL 能够表示一组固定的数据,并且可以基于不同的样式表来以不同的方式显示这些数据的能力是显示视图的最佳解决方案。然而,这只是一种例外的情况,而不是通用的规则。如果您只是生成 HTML 来表达每一个页面,那么在大多数情况下,XSL 是一种不必要的技术,并且,它给您的开发人员所带来的问题远比它所能解决的问题多。

10. 当使用 HttpSession 时,尽量只将当前事务所需要的状态保存其中,其他内容不要保存在 HttpSession 中。


启用会话持久性。

HttpSessions 对于存储应用程序状态信息是非常有用的。其 api 易于使用和理解。遗憾的是,开发人员常常遗忘了 HttpSession 的目的----用来保持暂时的用户状态。它不是任意的数据缓存。我们已经见到过太多的系统为每个用户的会话放入了大量的数据(达到兆字节)。那好了,如果同时有 1000 个登录系统的用户,每个用户拥有 1MB 的会话数据,那么就需要 1G 或者更多的内存用于这些会话。要使这些 HTTP 会话数据较小一些,不然的话,您的应用程序的性能将会下降。一个大约比较合适的数据量应该是每个用户的会话数据在 2K-4K 之间,这不是一个硬性的规则,8K 仍然没有问题,但是显然会比 2K 时的速度要慢。一定要注意,不要使 HttpSession 变成数据堆积的场所。

一个常见的问题是使用 HttpSession 缓存一些很容易再创建的信息,如果有必要的话。由于会话是持久性的,进行不必要的序列化以及写入数据是一种很奢侈的决定。相反地,应该使用内存中的哈希表来缓存数据,并且在会话中保存一个对此数据进行引用的关键字。这样,如果不能成功登录到另外的应用服务器的话,就可以重新创建数据。

当谈及会话持久性时,不要忘记要启用这项功能。如果您没有启用会话持久性,或者服务器因为某种原因停止了(服务器故障或正常的维护),则所有此应用服务的当前用户的会话将会丢失。这是件令人非常不高兴的事情。用户不得不重新登录,并且重新做一些他们曾经已经做过的事情。相反地,如果启用了会话持久性,WebSphere 会自动将用户(以及他们的会话)移到另外一个应用服务器上去。用户甚至不知道会有这种事情的发生。我们曾经见到过一些产品系统因为存在于本地代码中令人难以忍受的 bug(不是 IBM 的代码!)而突然崩溃的情况,这这种情况下,上述功能仍然可以运行良好。

11. 在 WebSphere 中,使用动态缓存,并使用 WebSphere servlet 缓存机制。

通过使用这些功能,系统性能可以得到很大的提高,而开销是很小的。并且不影响编程模型。

通过缓存来提高性能的好处是众所周知的事情。遗憾的是,当前的 J2EE 规范没有包括一种用于 servlet/JSP 缓存的机制。然而,WebSphere 提供了对页面以及片断缓存的支持,这种支持是通过其动态缓存功能来实现的,并且不需要对应用程序作出任何改变。其缓存的策略是声明性的,而且其配置是通过 XML 配置描述符来实现的。因此,您的应用程序不会受到影响,并保持与 J2EE 规范的兼容性和移植性,同时还从 WebSphere 的 servlet 及 JSP 的缓存机制中得到性能的优化。

从 servet 及 JSP 的动态缓存机制得到的性能的提高是显而易见的,这取决于应用程序的特性。Cox 和 Martin [Cox] 指出对一个现有的 RDF(资源描述格式)站点摘要 (RSS)servlet,当使用动态缓存时,其性能可以提高 10%。请注意这个实验只涉及到一个简单的 servlet,这个性能的增长量可能并不能反映一个复杂的应用程序。

为了更多地提高性能,将 WebSphere servlet/JSP 结果缓存与 WebSphere 插件 ESI Fragment 处理器、IBM HTTP Server Fast Response Cache Accelerator (FRCA) 和 Edge Server 缓存功能集成在一起。对于繁重的基于读取的工作负荷,通过使用这些功能可以得到许多额外的好处。

12. 为了提高程序员的工作效率,将 CMP 实体 bean 作为 O/R 映射的首选解决方案.

通过 WebSphere 框架(readahead、缓存、隔离级别等)优化性能。如果可能,有选择的应用一些模式来达到提高性能的目的,例如 Fast-Lane 阅读器 [Marinescu]。

对象/关系(O/R)映射是使用 Java 创建企业级的应用程序的基础。几乎每个 J2EE 应用程序都需要一些类型的 O/R 映射。J2EE 厂商提供一种 O/R 映射机制,这种机制在不同的厂商间是可移植的,高效的,并且能够被一些标准及工具很好地支持。这就是 EJB 规范中的 CMP(容器管理的持久性)部分。

早期的 CMP 实现以表现不佳及不支持许多 sql 结构而著称。然而,随着 EJB 2.0 及 2.1 规范的出现,以及被一些厂商所采纳,并且随着像 IBM WebSphere Studio Application Developer 的出现,这些问题已经不再是问题了。

CMP EJB 组件现在已经被广泛地应用于许多高性能的应用程序中。WebSphere 包括一些优化功能以提高 EJB 组件的性能,优化功能包括:对生命周期的缓存和 read-ahead 能力。这两者优化功能都是配置时的选项,并且不需要对应用程序进行修改或者影响可移植性。

处于缓存状态的生命周期缓存 CMP 状态数据并提供基于时间的无效性。从处于缓存状态的生命周期得到的性能提高可以达到选项 A 的缓存性能,并且仍然可以为您的应用程序提供可伸展性。Read-ahead 能力和容器管理的关系结合使用。这个特性通过在相同的查询中随意地检索相关的数据作为父数据而减少与数据库的交互。如果相关的数据要通过使用并发的查询来访问的话,这种方法可以得到性能的改进。[Gunther]提供了详细的描述以及通过这些特性得到的性能提高的细节。

此外,为了完全优化您的 EJB 组件,当指定隔离级别时要特别注意。尽可能使用最低的隔离级别,并且仍然保持您的数据的完整性。较低的隔离级别可以提供最佳的性能,并且可以降低出现数据库死的危险。

这是目前最有争议的最佳实践。已经有大量的文章赞扬 CMP EJB,同样的贬斥声也不绝于耳。然而,这里最基本的问题是数据库开发是困难的。当您开始使用任何持久性解决方案之前,您需要掌握查询以及数据库锁定如何工作这些基础知识。如果您选择使用 CMP EJB,您要确保您已经通过一些书籍(例如 [Brown] 和 [Barcia])知道如何使用它们。在锁定及争用方面有一些微妙的交互难以理解,但是,在您耗费一定的时间及努力后会将其掌握的。

--结束END--

本文标题: 12个最重要的J2EE最佳实践(2)

本文链接: https://lsjlt.com/news/233428.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 12个最重要的J2EE最佳实践(2)
    12个最重要的J2EE最佳实践(2)[@more@]7. 使用无状态会话 bean,而不是有状态会话 bean这样做可以使您的系统经得起错误的终止。使用 HttpSession 存储和用户相关的状态。 以我们的观点看来,有状态会话 bean...
    99+
    2023-06-03
  • SEO 中 Meta 标签的重要性和最佳实践
    告知搜索引擎页面内容: 标题标签、元描述和标签提供页面主题和内容的简洁概述。 提高搜索可见性: 优化元标签有助于页面在搜索结果页(SERP)中排名更高。 吸引用户点击: 引人注目的元描述可以鼓励用户点击您的页面,从而增加流量。 元标签...
    99+
    2024-04-02
  • Java ActiveMQ 的 20 个最佳实践
    1. 选择合适的客户端传输协议 ActiveMQ 支持多种客户端传输协议,包括 STOMP、AMQP 和 OpenWire。根据您的应用程序需求选择合适的协议,以优化性能和可靠性。 2. 配置消息持久性 持久性消息即使在服务器重新启动后...
    99+
    2024-02-19
    ActiveMQ 消息代理 JMS 消息传递 性能 可靠性 可伸缩性
  • C++ 函数重载的最佳实践
    c++++ 函数重载最佳实践:1、使用清晰且有意义的名称;2、避免过载过多;3、考虑默认参数;4、保持参数顺序一致;5、使用 sfinae。 C++ 函数重载的最佳实践 函数重载允许我...
    99+
    2024-04-20
    c++ 函数重载 代码可读性
  • PHP 代码重构最佳实践
    答案:php 代码重构遵循提高解耦性、可读性、可维护性、减少复杂性的原则。实践:使用命名空间组织代码。用依赖注入容器解耦组件。重构冗余代码。分解大型类。使用现代代码风格。 PHP 代码...
    99+
    2024-05-06
    php 重构 phpstorm laravel
  • HTTP重定向的最佳实践——你知道几个?
    在Web开发中,HTTP重定向是一个非常常见的技术。它可以把一个URL重定向到另一个URL,这对于网站的SEO和用户体验都非常重要。在本文中,我们将介绍HTTP重定向的最佳实践,以及一些代码演示。 使用301重定向 在HTTP重定向中...
    99+
    2023-10-24
    javascript http 重定向
  • PHP开发中的10个最佳实践
    PHP是一种广泛使用的开源脚本语言,特别适用于Web开发领域。与许多其他编程语言相比,PHP的学习曲线较为平滑,但是为了生产高质量、可维护的代码,遵守最佳实践是非常重要的。下面是PHP开发中的10个最佳实践。使用命名空间在开发PHP应用程序...
    99+
    2023-05-23
    最佳实践 PHP语言 开发技巧
  • VMware 服务器的最佳实践:实现最佳性能
    ...
    99+
    2024-04-02
  • golang函数最佳实践在团队协作中的重要性
    在团队协作中,遵循 go 函数最佳实践至关重要,可提高代码可读性、可维护性和可扩展性。这些实践包括:清晰的函数命名、参数和返回值管理、文档和注释、代码结构和组织、单元测试。具体来说,函数...
    99+
    2024-05-02
    团队协作 golang 代码可读性
  • MySQL 的 20+ 条最佳实践
    数据库操作是当今 Web 应用程序中的主要瓶颈。 不仅是 DBA(数据库管理员)需要为各种性能问题操心,程序员为做出准确的结构化表,优化查询性能和编写更优代码,也要费尽心思。 在本文中,我列出了一些针对程序员的...
    99+
    2022-05-10
    MySQL MySQL
  • Golang接口的最佳实践
    在Golang中,接口是一种定义对象行为的类型。接口提供了一种方式来指定对象应该具有的方法,并且让不同的类型实现这些方法。使用接口能够使代码更加灵活和可扩展,同时也符合面向对象编程中的...
    99+
    2024-02-24
    实践 golang 接口实现
  • 数据库设计的十个最佳实践
    数据库是应用及计算机的核心元素,负责存储运行软件应用所需的一切重要数据。为了保障应用正常运行,总有一个甚至多个数据库在默默运作。我们可以把数据库视为信息仓库,以结构化的方式存储了大量的相关信息,并合理分类,方便搜索及使用(java项目 f...
    99+
    2018-09-30
    数据库设计的十个最佳实践
  • 10个微妙的Java编码最佳实践
    这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表。和Josh Bloch的列表容易学习并且关注日常情况相比,这个列表将包含涉及API/SPI设计中不常见的情况,可能有很大影响。我在编写和维...
    99+
    2023-05-30
    java 编码 最佳实践
  • JavaScript错误处理的10个最佳实践
    JavaScript错误处理是处理JavaScript代码运行时发生的错误的技术,包括识别、报告和恢复错误。它是开发人员日常工作中不可或缺的一部分,因为错误处理可以帮助开发人员识别和解决代码中的问题,提高应用程序的稳定性和可靠性。 使...
    99+
    2024-02-27
    JavaScript、错误处理、最佳实践、异常、调试、日志记录、监控、测试
  • C++ 函数重载的最佳实践是什么?
    函数重载最佳实践包括:避免过度使用、保持一致性、优先考虑默认参数、使用 sfinae、考虑可变参数。通过明智地使用重载,可以提高代码的可读性、可维护性和可扩展性,就像在 print() ...
    99+
    2024-04-27
    c++ 重载
  • 实时重定向缓存:Java中的最佳实践?
    在现代软件开发中,缓存是一项非常重要的技术。缓存可以减少对数据库的访问,降低系统负载,提高响应速度。但是,缓存也存在一些问题,例如缓存过期、缓存雪崩等。为了解决这些问题,实时重定向缓存(Real-time Redirection Cach...
    99+
    2023-06-22
    重定向 实时 缓存
  • PHP 重定向与容器框架:实现最佳实践的关键要素。
    PHP 重定向与容器框架:实现最佳实践的关键要素 在现代 Web 应用中,重定向是非常常见的一种操作,它可以将用户从一个 URL 地址重定向到另一个 URL 地址,以实现页面跳转、表单提交、登录验证等功能。而在 PHP 中,重定向的实现可以...
    99+
    2023-09-17
    重定向 容器 框架
  • 处理两个 github go 项目的最佳实践
    php小编百草为您带来了关于处理两个 GitHub Go 项目的最佳实践的介绍。在开发过程中,我们经常需要处理多个项目之间的依赖关系和代码协作。本文将分享一些有效的方法和建议,帮助您优...
    99+
    2024-02-09
  • 重定向关键字:PHP和JavaScript的最佳实践。
    PHP和JavaScript是当今最流行的编程语言之一。PHP作为一种服务器端语言,主要用于开发Web应用程序。而JavaScript作为一种客户端语言,主要用于开发交互式Web应用程序。本文将介绍PHP和JavaScript的最佳实践,帮...
    99+
    2023-10-19
    关键字 重定向 javascript
  • Java中NumPy打包和重定向的最佳实践?
    在Java中,NumPy是一个很好的数据科学库,它可以帮助我们进行数学计算和数据分析。NumPy的强大之处在于它提供了一个高效的多维数组对象,以及许多用于操作这些数组的函数。但是,在使用NumPy时,我们经常会遇到一些问题,例如如何打包和...
    99+
    2023-06-04
    打包 numy 重定向
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作