繁体   English   中英

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

[英]Stateless Session Bean vs Stateless Singleton

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

在理解Stateless会话bean之后,我想到的一个问题是,你能不能总是用没有本地成员的类的共享实例替换无状态会话bean(实际上使它成为无状态)? 我读到了关于无状态会话bean的实例池。 如果没有状态,你能不能简单地使用一个实例?

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

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

public void foo() {
    this.someVar = bar();
    this.someOtherVar = baz();
    zing();
}

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

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

所以无状态会话bean比简单的无状态单例更有用。

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

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

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

除了使用EJB的EJB复杂性之外,您还可以获得更具伸缩性的解决方案。

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

当然你可以用“共享类”来实现所有东西,但是为什么你想要在已经完全免费的情况下重新发明轮子呢?

无状态会话bean用于将业务逻辑实现为应用程序的核心部分。 在Java EE分层体系结构中,您有3层:1。表示2.业务3.数据

EJB在Businness逻辑中起着重要作用。 您有两种选择SLSB和SFSB。 第一个更具可伸缩性,由Application Server汇总但无法保持其状态。 第二个是可扩展性较低的,每个客户端会话都有一个SFSB。 当您必须在客户端之间保持业务逻辑的对话时使用它们,例如,仅在对SFSB的一次方法调用中无法完成的操作。 即使我建议您仅使用SLSB来管理持久性,SLSB和SFSB也可以保留对EntityManager的引用来管理实体持久性。 EJB3和JPA是一个很好的解决方案。 希望这对你有所帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM