代码之家  ›  专栏  ›  技术社区  ›  Andrew Swan

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

  •  2
  • Andrew Swan  · 技术社区  · 16 年前

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

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

    fwiw,这个服务的方法都不是 synchronized .

    说明:我将slsb转换为pojo的动机是简化对象的生命周期(真正的singleton与容器管理),以及代码本身(一个接口和一个带注释的pojo,而不是三个接口、一个bean类和ejb jar.xml中的一堆XML)。

    另外,fwiw,所讨论的服务是jboss 3.x上运行的并置Web应用程序的一个组件。

    2 回复  |  直到 16 年前
        1
  •  3
  •   mdma    16 年前

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

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

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

        2
  •  1
  •   KLE rslite    16 年前

    你的POJO看起来很完美。

    所以,不存在竞争,您的可伸缩性将是完美的。

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