什么时候用有状态session bean,什么时候用无状态session bean

什么时候用有状态session bean,什么时候用无状态session bean

最近,有关于无状态的许多大惊小怪。无状态的缺陷常常被夸大,
它的优点也一样。许多无状态的支持者盲目的宣称无状态能带来
更大的伸缩性;而有状态的支持者争论说必须为了适应无状态
而重建整个系统。真实的情况是什么呢?

通过正确地设计,无状态有以下两个优点:
1.使用stateless bean,EJB容器能容易的pooling和重用bean,
允许少量的bean去服务很多客户端。用stateful bean去做同样
的事情时,bean的状态在方法调用之间必需要钝化和活化,可
能导致I/O瓶颈。所以无状态的一个实际的好处是使用很小的
开销来容易的pool和重用组件。

2.因为一个stateful session bean在内存中缓冲一个客户端
的对话,一个bean失败可能导致失去你的对话。这能导致严重
的反响,如果你不在写bean时考虑到这一点,或者你不使用一
个提供有状态恢复的EJB产品。在一个无状态模型里面,请求
能被透明的重路由到一个不同的组件,因为任何组件都能为
客户端的需要提供服务。

   最大的无状态的缺点是你需要在每个方法调用中把客户相关的
的数据推到stateless bean。大多数stateless session bean
将需要接收对一个客户端特定的一些信息,如对banking bean的
银行帐户号码。这些信息要每次一个客户端请求到达时被提供到
stateless bean,因为bean不能对一个特定的客户端保持状态。

  一种向bean提供客户相关的数据的方法是把数据作为参数传到
bean的方法中。这可能导致性能下降,然而,只是发生在传递的
数据量很大的情况下。这也阻塞了网络,降低了其他进程的带宽。

  另一种为stateless bean提供客户相关的数据的方法,为那个
bean为一个客户端持久性的存储数据。客户端不需要在一个方法
调用中传递所有的状态,而只简单的需要从持久化的storage得到
数据。这里的trade-off又是性能:存储对话持久化的能得到存储
I/O瓶颈,而不是网络I/O瓶颈。

  再一种超越无状态的限制的方法是使用JNDI去存储客户相关数据
到一个目录结构。客户端能够等一会传给bean一个在目录结构定位
数据的标识。这和存储数据到数据库很相似。比较大的区别是JNDI
实现能是一个in-memory实现(和共享属性管理器有相同作用,对
com+读者来说应该很熟悉)。如果数据存在内存中,没有数据库会
碰上。

  当从有状态和无状态之间选择,你应该问你自己商业进程展开
多调用,需要一个对话?如果是这样,有状态模型应该很合适因
为客户相关的对话能成为bean状态的一部分。相反,如果你的商业
进程变成一个方法调用,无状态能更适合你的需要。

  注意如果你要去使用状态,并且你要去建一个基于web的系统,
你可能可以用一个servlet的HttpSession对象去做到这一点,和
stateful session bean大致一样。该用stateful session bean
而不是HttpSession的情况如下:
1.你需要一个事务感知的有状态对象。你的session bean能用
SessionSynchronization来做到这一点。

2.你既有基于web的也有不基于web的客户端来存取你的EJB层,
而且都需要状态。

3.你在使用一个stateful session bean来暂时存储一个商业进程
的暂时状态,这发生在牵扯到多个bean的单个Http请求中。

  综上所述,大多数先进的deployment要有复杂而有趣的有状态的
和无状态的组合。使用对你的商业问题最合适的。一个例外是如果
有一个明显的瓶颈,如保持成兆的状态在内存中。而如果你在选择
有状态还是无状态,你会发现有状态可能不是你的首要问题:直到
你测试你的代码,你还在黑暗中乱开枪。如果有状态是你的瓶颈,
如果有必要,你可以重构你的代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Session Facade是一种设计模式,用于在应用程序中提供统一的接口,使客户端可以与底层系统进行交互。该模式将底层系统封装在一个高级接口中,使客户端可以更方便地访问底层系统,同时也可以保护底层系统的实现细节。 在会话Bean中注入实体管理器是一种常见的使用方式。实体管理器是JPA规范中的一个组件,用于管理实体对象的持久化状态。在会话Bean中注入实体管理器可以使开发人员更方便地对实体对象进行操作,比如查询、插入、更新等。 使用Session Facade模式和注入实体管理器有以下特点: 1. 统一接口:Session Facade模式提供了一个统一的接口,使客户端可以更方便地访问底层系统的功能,而不需要了解底层系统的实现细节。 2. 简化操作:通过注入实体管理器,开发人员可以更方便地对实体对象进行操作,比如查询、插入、更新等。 3. 提高性能:由于会话Bean通常是有状态的,因此开发人员可以利用这一特性来缓存实体对象,从而提高应用程序的性能。 4. 提高可维护性:Session Facade模式可以将底层系统的实现细节隐藏起来,从而提高应用程序的可维护性。开发人员可以更方便地进行重构和修改,而不会影响客户端的使用。 ### 回答2: Session Facade模式是一种设计模式,用于在企业应用程序中提供统一的接口,以封装底层系统的复杂性。它的核心思想是通过一个会话Bean来集成和暴露系统中的多个底层服务,实现对外提供统一的接口。 在会话Bean中注入的实体管理器是用于处理与数据库交互的对象。它有以下使用特点: 1. 数据库事务管理:实体管理器可以管理数据库事务。在会话Bean中,可以使用注解或编程方式来指定事务的边界,并通过实体管理器来控制事务的启动、提交和回滚。 2. 实体对象管理:实体管理器可以跟踪和管理实体对象的生命周期。通过实体管理器,可以进行实体对象的创建、读取、更新和删除操作,以及查询操作。 3. 缓存管理:实体管理器可以使用缓存来提高数据库访问性能。它可以在查询时自动使用缓存,并在更新操作后更新缓存,以减少对数据库的访问次数。 4. 乐观锁控制:实体管理器可以实现乐观锁控制,用于解决并发访问冲突的问题。它可以通过版本字段或时间戳字段来检测并发更新冲突,并提供相关的异常处理机制。 5. 查询语言支持:实体管理器可以支持各种查询语言,如JPQL、SQL和Criteria查询。它可以使用这些查询语言进行复杂的查询操作,并提供结果集的处理和返回。 总之,通过在会话Bean中注入实体管理器,可以方便地进行对数据库的操作和管理,同时提供了事务管理、实体对象管理、缓存管理、乐观锁控制和查询语言支持等功能。这样可以使得业务逻辑代码更简洁、清晰,并提高系统的可维护性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xxcc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值