concurrency - 将无状态 session Bean 转换为 POJO 的可扩展性影响

标签 concurrency singleton scalability pojo stateless-session-bean

想象一个被频繁使用的服务对象,它被实现为 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/

相关文章:

php - PHP 与 MYSQL 的并发

javascript - 避免 Angular 中的多个服务实例

ios - 单例和委托(delegate)

c++ - 是什么保证弱松弛的无竞争 CAS 循环终止?

java - 股市应用中数据库的并发问题如何处理?

ios - swift 中的 loadNibNamed 应该返回 Singleton 对象

sockets - 横向扩展套接字服务器

postgresql - 在数据库中搜索(相似)字符串的可扩展方式

ruby-on-rails - 扩展 Ruby on Rails 站点

java - 为什么不建议从 finally 子句中调用二进制信号量的 release() 方法?