Java 无状态会话Bean与无状态单例

Java 无状态会话Bean与无状态单例,java,jakarta-ee,ejb,ejb-3.0,openejb,Java,Jakarta Ee,Ejb,Ejb 3.0,Openejb,我是EJB新手,最近开始研究EJB(3.0)。我已经使用Java 6年了,但以前从未使用过EJB。至少可以说,整个EJB业务的复杂性让我不知所措。我不明白我在哪里可以实际应用一些概念 在理解无状态会话bean之后,我想到的一个问题是,您不能总是将无状态会话bean替换为没有本地成员的类的共享实例(有效地使其成为无状态的)?我了解到正在为无状态会话bean进行实例池。如果没有状态,您能否不简单地使用一个实例 我正在OpenEJB上部署我的示例,其中一个我必须使用无状态会话bean的地方是与Enti

我是EJB新手,最近开始研究EJB(3.0)。我已经使用Java 6年了,但以前从未使用过EJB。至少可以说,整个EJB业务的复杂性让我不知所措。我不明白我在哪里可以实际应用一些概念

在理解无状态会话bean之后,我想到的一个问题是,您不能总是将无状态会话bean替换为没有本地成员的类的共享实例(有效地使其成为无状态的)?我了解到正在为无状态会话bean进行实例池。如果没有状态,您能否不简单地使用一个实例


我正在OpenEJB上部署我的示例,其中一个我必须使用无状态会话bean的地方是与EntityManager交互。我不确定是否可以在任意类中获得EntityManager的句柄。除此之外,无状态会话bean试图解决的问题仍然令人困惑。

不,无状态会话bean可以有状态,但该状态没有被持久化/绑定到会话。该状态的一部分是注入的EJB或其他POJO,它们可能是有状态bean等。因此,每个请求都需要一个无状态会话bean


相反,对于一个用户会话,您有一个唯一的有状态会话bean,因此该状态被绑定到会话

无状态会话bean可能有状态。但它可能没有会话状态。因此,会话bean方法执行以下操作是完全可以接受的(尽管这种做法很糟糕):

除了池之外,EJB容器还提供了几个带有无状态bean的服务:

  • 依赖注入
  • 声明性事务划分
  • 声明式安全性
  • 访问EJB上下文
  • 等等

因此,无状态会话bean比简单的无状态单例更有用。

您可以在任意类中处理EntityManager,但真正的问题是您希望如何构建解决方案

除了EJB复杂性之外,使用EJB可以为您提供更具可伸缩性的解决方案

如前所述,EJB在开发基于事务的应用程序时非常有用。 ApplicationServer为您提供了事务管理、EJB池、安全性等功能

当然,你可以用一个“共享类”来实现每一件事,但是既然你已经拥有了所有的免费资源,为什么还要重新发明轮子呢

无状态会话bean用于实现业务逻辑,业务逻辑是应用程序的核心部分。 在Java EE分层体系结构中,您有3层: 1.演示 2.生意 3.资料

EJB在业务逻辑中扮演着重要的角色。你有两个选择 SLSB和SFSB。第一个更具可伸缩性,由应用服务器汇集,但无法保持其状态。 第二个是可伸缩性较差的,每个客户端会话有一个SFSB。当您必须在客户端和业务逻辑之间进行对话时,可以使用它们,例如,一个操作不能在对SFSB的一个方法调用中完成。 SLSB和SFSB可以保留对EntityManager的引用以管理实体持久性,即使我建议您仅使用SLSB来管理持久性。 EJB3和JPA是一个很好的解决方案。
希望这能对您有所帮助

我认为这是有争议的,但是我能不能不总是用Spring之类的东西来代替EJB,同时降低巨大的复杂性?我发现我写的东西不一定可以移植到其他应用服务器上。在Geronimo、TomEE、GlassFish和JBoss中,我遇到了各种各样的问题,以获得一个简单的实体bean,作为JPA与Hibernate一起工作。只能让它与JBoss一起工作而没有太大问题。问题主要在于加载包装在WEB-INF/lib/+1中的Hibernate JAR。例如,一个常见的“临时状态”是一个注入的EntityManager,它应仅用作“一个工作单元”。
public void foo() {
    this.someVar = bar();
    this.someOtherVar = baz();
    zing();
}