2

想象一个被大量使用的服务对象,它被实现为 EJB 2.1 SLSB,并且由于没有任何状态,它本身也恰好是线程安全的。它所有的公共方法都是事务性的(通过 CMT),最简单的需要一个事务,但有些需要一个新的事务。

如果我将此 SLSB 转换为真正的单例 POJO(例如使用 DI 框架),这将如何影响应用程序的可伸缩性?当服务是 SLSB 时,EJB 容器将管理一个实例池,每个客户端都可以从中获取自己的副本,所以我想知道将其转换为单例 POJO 是否会对该单个实例引入某种争用。

FWIW,此服务的方法都不是synchronized.

澄清:我将 SLSB 转换为 POJO 的动机是简化对象的生命周期(真正的单例与容器管理)和代码本身(一个接口和一个带注释的 POJO,与三个接口、一个 bean 类和一堆ejb-jar.xml 中的 XML)。

此外,FWIW,所讨论的服务是在 JBoss 3.x 上运行的并置 Web 应用程序的一个组件。

4

2 回答 2

3

如果 POJO 是真正无状态的,或者没有会话状态(即状态是不可变的),那么这不会降低性能,甚至可能会略有改善,因为您实际上只使用了 DI 框架中的一个实例而不是容器中的池. (即使池在高负载下也会出现争用。)

设计为线程安全的对象不需要同步,例如没有或只有不可变状态的对象。不会有争用——线程可以在 POJO 上自由执行方法而无需同步。

通过仅使用 POJO,您还可以真正了解您的应用程序中发生了什么,并且可以确定幕后没有隐藏的“容器魔法”。

于 2010-07-06T09:23:08.293 回答
1

你的 POJO 看起来很完美。

所以不,不会有争用,你的可扩展性将是完美的。

  • 您无需支付额外费用。
  • 你甚至更少,因为你有一个实例而不是几个
  • 您的可扩展性更好,因为您永远不会达到池的限制(您没有)。
于 2009-10-09T07:45:57.163 回答