Concurrency 将无状态会话bean转换为POJO的可伸缩性影响

Concurrency 将无状态会话bean转换为POJO的可伸缩性影响,concurrency,singleton,scalability,pojo,stateless-session-bean,Concurrency,Singleton,Scalability,Pojo,Stateless Session Bean,想象一下,一个被大量使用的服务对象被实现为EJB2.1SLSB,而且由于没有任何状态,它本身也是线程安全的。它的所有公共方法都是事务性的(通过CMT),最简单的方法是需要一个事务,但有些方法需要一个新的事务 如果我将此SLSB转换为真正的单例POJO(例如,使用DI框架),这将如何影响应用程序的可伸缩性?当服务是SLSB时,EJB容器将管理一个实例池,每个客户端将从中获得自己的副本,因此我想知道将其转换为单实例POJO是否会对该单实例引入某种争用 FWIW,此服务的所有方法均未同步 澄清:我将S

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

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

FWIW,此服务的所有方法均未同步

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


另外,FWIW,该服务是运行在JBoss3.x上的并置web应用程序的一个组件。

您的POJO看起来很完美

因此,不会有争用,您的可伸缩性将是完美的

  • 你没有额外的费用
  • 你甚至更少,因为你有一个而不是几个实例
  • 您的可伸缩性更好,因为您永远不会达到池的极限(您没有)

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

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


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

这个答案:声称会有“很多争论和阻碍”,但没有确证、引用,甚至没有对该声明进行投票,所以我不知道该给它多大的份量(不冒犯Mwanji的意图)。你能详细介绍一下你的环境吗?您仍然在使用JavaEE服务器吗?你是在一个盒子上跑步还是在多个盒子上跑步?每盒多少芯?为什么你需要一个单独的POJO而不是在不同的线程中进行操作?@Jim:我已经更新了这个问题。但是你的评论似乎暗示一个单线程不能为多个线程提供服务——真的是这样吗?这是我问题的核心;在可伸缩性方面,使用一个POJO与使用一个池式SLSB相比如何?一些线程必须等到其他线程完成后才能使用POJO吗?是的,FWIW。我已经相应地更新了这个问题。