想象一个被频繁使用的服务对象,它被实现为 EJB 2.1 SLSB,而且由于没有任何状态,它本身也是线程安全的。它的所有公共(public)方法都是事务性的(通过 CMT),大多数只需要一个事务,但有些需要一个新的事务。
如果我将此 SLSB 转换为真正的单例 POJO(例如使用 DI 框架),这将如何影响应用程序的可扩展性?当服务是 SLSB 时,EJB 容器将管理一个实例池,每个客户端都可以从中获取自己的副本,因此我想知道将其转换为单例 POJO 是否会对该单个实例引入某种争用。
FWIW,该服务的所有方法均未同步
。
澄清:我将 SLSB 转换为 POJO 的动机是对象生命周期(真正的单例与容器管理)和代码本身的简单性(一个接口(interface)和一个带注释的 POJO,与三个接口(interface)、一个 bean 类、以及 ejb-jar.xml 中的一堆 XML)。
此外,FWIW,相关服务是在 JBoss 3.x 上运行的并置 Web 应用程序的一个组件。
最佳答案
如果 POJO 确实是无状态的,或者没有 session 状态(即状态是不可变的),那么这不会使性能恶化,甚至可能会略有改善,因为您实际上只使用 DI 框架中的一个实例而不是池从容器中。 (即使是池在高负载下也会出现争用。)
对于设计为线程安全的对象,例如没有状态或只是不可变状态的对象,不需要同步。不会出现争用 - 线程可以自由地执行 POJO 上的方法,无需同步。
通过仅使用 POJO,您还可以真正了解应用程序中发生的情况,并且可以确保幕后没有隐藏的“容器魔法”。
关于concurrency - 将无状态 session Bean 转换为 POJO 的可扩展性影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1541972/