有状态会话Bean(sfsb)和无状态会话Bean(slsb)的区别

有状态会话Bean和无状态会话Bean的区别
状态通常理解为对象的属性,那么无状态就是没有属性,有状态就是有属性,这种理解是不正确的。
这里的无状态确实与属于相关,但有状态会话Bean和无状态会话Bean之间的区别并不是是否有属性,而是是否保存客户端的属性。有状态会话Bean会保存客户端的状态,而无状态Bean不会专门保存客户端的状态。这里需要强调“专门”是因为无状态会话Bean也会有成员变量,有成员变量就可以保存状态,但它不会专门为特定的客户端保存状态。
区别的根本原因
这与无状态会话Bean和有状态会话Bean的运行原理是相关的。
对于有状态会话Bean来说,只要有客户端发送对有状态会话Bean的访问,服务器都会创建一个会话Bean实例与该客户端对应,这样这个实例与这个客户端就是一一对应的。如果客户端在Bean实例中保存了信息,之后还可以使用。
对于无状态会话Bean来说,服务器端会维持一个实例池,创建好若干个实例对象供客户端调用。当从客户端发送创建会话Bean的请求时,并不一定会真的创建EJB,多数情况下是从实例池中得到一个实例,用完之后重新放回实例池。如果下次再访问,再从实例池中取出一个实例使用,并不一定是上次的实例。即使两次访问使用的是同一个实例,在两次访问之间也有可能有其他的客户端访问了该实例。所以,并不能保证在多次访问之间的信息会被保存。所以,无状态会话Bean不会专门保存客户端的信息。
各自的优缺点
因为有状态会话Bean需要保存特定客户端的信息,一个客户端对应一个实例,既是在当时客户端有连接没有访问的情况下,也要为这个客户端保留这个实例。这样随着客户端数量的增加,服务器端需要创建的实例的数量也在增加,增加到一次程度对服务器的性能就会有一定的影响。为了不对服务器的性能产生影响,通常服务器会进行一些优化。当客户端的数量超过某个值之后,就不创建新的实例。虽然不创建新的实例,还是需要对用户响应,这时候就采用共享实例的方式。会查看哪个实例虽然处于连接状态,但是没有访问,然后把这个实例的状态保存起来,使用这个实例为新的请求服务,对于原来的客户端来说,称为挂起。如果原来的客户端又发送请求了,会重新查找一个空闲的实例并且把已经保存好的状态恢复回来,这个过程称为激活。所以在有状态会话Bean的访问过程,经常会发生查找实例,激活挂起等操作,所以效率比较低。
而发送对无状态会话Bean的请求的时候,可以随便取一个空闲的实例为客户端服务,所以效率比较高。
有状态会话Bean的好处是,可以保存客户端的状态,所以客户端在后续访问的时候就可以少传递一些参数。而状态会话Bean需要传递方法执行过程中需要的所有参数。
如何选择
根据上面分析的有状态会话Bean和无状态会话Bean的优缺点。如果要频繁的访问,并且多次访问之间会共享一些信息,这时候应该使用有状态会话Bean。对于不经常使用的功能,可以使用无状态会话Bean。无状态会话Bean的使用要比有状态会话Bean的使用多。
一个描述无状态会话Bean和有状态会话Bean区别的实例
下面的代码是一个表示购物车的有状态会话Bean:
package ch19;
import javax.ejb.Stateful;
import java.util.List;
@Stateful
public class CartBean implements Cart{
private String customerId;
private String customerName;
private ArrayList<String> contents;
public void initialize(String person) throws BookException {
if (person == null) {
throw new BookException("不允许没有用户!");
} else {
customerName = person;
}
customerId = "0";
contents = new ArrayList<String>();
}
public void initialize(String person, String id)
throws BookException {
if (person == null) {
throw new BookException("不允许没有用户!");
} else {
customerName = person;
}
IdVerifier idChecker = new IdVerifier();
if (idChecker.validate(id)) {
customerId = id;
} else {
throw new BookException("无效的ID: " + id);
}
contents = new ArrayList<String>();
}
public void addBook(String title) {
contents.add(title);
}
public void removeBook(String title) throws BookException {
boolean result = contents.remove(title);
if (result == false) {
throw new BookException(title + " 不在购物车中。");
}
}
public List<String> getContents() {
return contents;
}
@Remove()
public void remove() {
contents = null;
}
}
假设业务接口是Cart
代码来源:《Java EE 5实用教程——基于WebLogic和Eclipse》
如果在客户端注入两个EJB对象,通过实例注入,代码如下:
@EJB
Cart cart1;
@EJB
Cart cart2;
调用业务方法的代码如下:
cart1.initialize(“张三”);
cart1.addBook(“JSP2.0基础教程”);
cart1.addBook(“Java EE5实用教程”);
cart2.initialize(“李四”);
cart2.addBook(“ASP网站开发”);
cart2.addBook(“最新C#实例开发”);
List<String> books=cart1.getContents();
out.println(“cart1中的图书为:”);
for(int i=0;i<books.size();i++){
out.println(books.get(i));
}
books=cart2.getContents();
out.println(“<br>cart2中的图书为:”);
for(int i=0;i<books.size();i++){
out.println(books.get(i));
}
执行的结果如下:
cart1中的图书为:JSP2.0基础教程 Java EE5实用教程
cart2中的图书为:ASP网站开发 最新C#实例开发
如果把CartBean中的Stateful改成Stateless,重新运行会得到下面的执行结果:
cart1中的图书为:ASP网站开发 最新C#实例开发
cart2中的图书为:ASP网站开发 最新C#实例开发
为什么两次的结果不相同呢?有状态会话Bean的使用cart1和cart2对应两个Bean实例,各自有各自的属性。而在无状态会话Bean中,cart1和cart2实际上对应的是同一个Bean实例,所以通过cart1添加的图书被cart2的添加操作给覆盖了,所以最后cart1得到的图书不再是存放进去的“Java Web程序设计基础教程”和“Java EE 5实用教程”。通过这个实例可以更好的理解又状态会话Bean和无状体会话Bean的区别。
Spring的并发问题——有状态Bean和无状态Bean **一、有状态和无状态** **有状态会话bean** :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。简单来说,有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是**非线程安全**的。 **无状态会话bean** :bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean... 阅读详情

相关推荐

Qt·DBus快速入门

DBus快速入门

m0_64560763的博客 2273

spring的bean的作用域

有状态会话bean:每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。 无状态会话bean:bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用...

disuoxia5722的博客 284

IS-IS协议深度解析(二):LSDB同步机制与骨干网实战部署

本文深度解析IS-IS协议的LSDB同步机制与骨干网实战部署。详细阐述了DIS角色如何通过CSNP/PSNP报文高效管理链路状态数据库同步,并与OSPF DR机制进行对比。重点介绍了Level-2骨干网作为逻辑高速公路系统的工作原理,以及通过ATT比特位实现跨区域路由的自动化。最后提供了高可靠性骨干网的实战配置要点与验证方法。

kite3的博客 644

有状态会话Bean和无状态会话Bean的区别

    Session   Bean   主要的目的是让程序开发者将逻辑层抽离;    Entity   Bean   主要是资料组件,  Entity   Bean   主要的目的,在于提供资料,也就是说程序设计师可以将   Entity   Bean   当程序资料;     Message   Driven   Bean   与   Session   Bean   或是   Entity 

lingxiao301415的专栏 1万+

Discuz IIS上传附件大于28M失败报错Upload Failed.修改maxAllowedContentLength(图文教程)

下图:Discuz X3.5的系统信息,上传许可为1024MB(1GB)论坛为局域网论坛,仅供内部同事交流使用!使用官方最新的Discuz! X3.5 Release 20231221 UTF-8 下图:选择上传附件(提示可以最大上传100M) 下图:模拟上传84M的文件(

骚团长的博客 1830

Li‘s 核磁共振影像数据处理-4-使用3D Slicer从DTI计算参数图(FA、ADC等)

从DTI计算参数图 通过3D Slicer软件计算 主要步骤 导入DICOM影像 3D Slicer似乎只能支持DICOM格式和NRRD格式的DTI处理,而无法支持NIFTI+磁场梯度信息文件的方式。(这里不确定,如有错误请指正。) 模块选择: 需要选择或设置的内容包括:选择DicomToNrrd,设置Output DWI Volume file,设置Input Dicom Data Directory。设置好后点击“Apply”。 制作mask。 实质就是去脑壳。 模块选择: 需要设置的内

weixin_38594676的博客 3921

Java - 有状态bean和无状态bean

有状态Bean和无状态Bean的本质区别:声明周期 1. 前言:EJB EJB:称为企业Java beans,是基于分布式事务处理的企业级应用程序的组件。 Sun公司发布的文档中对EJB的定义是:EJB是用于开发和部署多层结构的、分布式的、面向对象的Java应用系统的跨平台的构件体系结构 EJB种类: EJB容器可以接收三类EJB: 会话Bean(Session Beans) 有状态会话Bean 无状态会话Bean 实体Bean(Entity Bean) 消息驱动Bean(Message Dri.

qq_40286155的博客 2484

DIY音频必备:手把手教你用AB类功放模块打造高保真桌面音响(含电路图)

本文详细指导如何利用AB类功放模块DIY高保真桌面音响,涵盖选型指南、核心元器件清单、电路搭建与焊接工艺,以及系统调试与音质优化技巧。AB类功放以其接近A类功放的音质和B类功放的效率,成为音频爱好者的理想选择,适合有一定电子基础的实践者。

weixin_42665725的博客 445

有状态会话Bean(SFSB)和无状态会话Bean(SLSB)的区别

本文转自:http://blog.youkuaiyun.com/hippoppower/article/details/4190006   稍作了修改 有状态会话Bean(SFSB)和无状态会话Bean(SLSB)的区别 1   无状态   (Stateless)        在不同方法调用间不保留任何状态   。     事务处理必须在一个方法中结束   。     通常资源占用较少;可以

路远,漫步前行 1147

数据分析实战:如何用皮尔逊相关系数避免伪相关陷阱(附Python代码)

本文通过实战案例与Python代码,深入解析了皮尔逊相关系数在数据分析中的应用与常见陷阱。文章重点揭示了如何识别与避免由混杂变量导致的伪相关,并介绍了通过可视化、敏感性分析、分层分析与偏相关分析等方法来检验相关性的可靠性,帮助分析师建立严谨的相关性思维。

weixin_29051245的博客 413

毫米波与太赫兹:十射线模型建模

Pt=1,只考虑地面和前后两面墙的反射,反射系数为0.7。用matlab设计程序并实现该功能。,总计考虑10条路径,求出接收功率随。

SupermarketX的博客 786

【Java Web开发指南】有状态会话Bean(SLSB) 和无状态会话Bean(SFSB)的区别

有状态会话Bean(SLSB) 和无状态会话Bean(SFSB)的区别 1 无状态 (Stateless) 在不同方法调用间不保留任何状态 。 事务处理必须在一个方法中结束 。 通常资源占用较少;可以被共享(因为它是无状态的) 。 无状态Bean不会"专门"保存客户端的状态----(需要强调“专门”是因为无状态会话Bean也会有成员变量,有成员变量就可以保存状态,但它不会专门为特定的客户端保存状态。)。 ----你对ENTITY BEAN的数据操作不会被容器维护,当其他的用户要用ENT

NJU phd 在读。 677

181、LLC谐振变换器的PCB设计实战(文件归档)

PCB设计实战经验总结:LLC谐振变换器的关键要点 本文通过实际案例总结了LLC谐振变换器PCB设计中的核心经验和常见误区。重点包括: 文件命名规范(项目代号_板卡类型_版本号_日期格式) 四层板标准层叠结构设计要点 谐振回路走线原则(宽度、长度控制) 地线处理技巧(功率地/控制地隔离) 散热设计注意事项(MOSFET过孔阵列、变压器布局) 完整的文件归档清单(Gerber、钻孔、装配图等) 作者特别强调,良好的设计归档习惯能显著降低生产问题概率,建议采用双重备份机制。文中多个真实案例(如谐振频率偏移、EM

Jack010169的博客 44

有状态会话Bean(SLSB)和无状态会话Bean(SFSB)的区别

 有状态会话Bean(SLSB)和无状态会话Bean(SFSB)的区别1   无状态   (Stateless)        在不同方法调用间不保留任何状态   。     事务处理必须在一个方法中结束   。     通常资源占用较少;可以被共享(因为它是无状态的) 。    无状态Bean不会"专门"保存客户端的状态----(需要强调“专门”是因为无状态会话Bean也会有成员变量,有成员变量

teedry的专栏 667

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

有状态会话Bean(SLSB)和无状态会话Bean(SFSB)的区别(转)

Session  Bean:分有状态会话Bean和无状态会话Bean两种,主要目的是提供程序逻辑层;Entity  Bean:资料组件,主要目的是提供程序资料;   下面主要对Session  Bean讨论   现实中,很多朋友对两种session bean存在误解,认为有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用,而认为无状态是每次调用实例化一次,不保留用户信息。仔细...

chenfeng0104的专栏 287

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SessionBean中有状态Bean与无状态Bean区别

SessionBean中有状态Bean与无状态Bean区别 有状态会话Bean(SLSB)和无状态会话Bean(SFSB)的区别1   无状态   (Stateless)        在不同方法调用间不保留任何状态   。     事务处理必须在一个方法中结束   。     通常资源占用较少;可以被共享(因为它是无状态的) 。    无状态Bean不会"专门"保存客户端的状态----(需...

quliangjun的专栏 223

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

有状态sessionbean 无状态sessionbean

有状态会话Bean(SLSB)和无状态会话Bean(SFSB)的区别1   无状态   (Stateless)        在不同方法调用间不保留任何状态   。     事务处理必须在一个方法中结束   。     通常资源占用较少;可以被共享(因为它是无状态的) 。    无状态Bean不会"专门"保存客户端的状态----(需要强调“专门”是因为无状态会话Bean也会有成员变量,有成员变量就

hippoppower的专栏 6700

有状态会话Bean和无状态会话Bean

有状态会话Bean(SLSB)和无状态会话Bean(SFSB)的区别 1   无状态   (Stateless)         在不同方法调用间不保留任何状态   。      事务处理必须在一个方法中结束   。      通常资源占用较少;可以被共享(因为它是无状态的) 。     无状态Bean不会"专门"保存客户端的状态----(需要强调“专门”是因为无状态会话Bean也会有成

xtwolf008--关注分布式存储,关注大数据,云计算PAAS 863

有状态bean 和 无状态bean

有状态会话Bean(SFSB)和无状态会话Bean(SLSB)的区别 1   无状态   (Stateless)         在不同方法调用间不保留任何状态   。      事务处理必须在一个方法中结束   。      通常资源占用较少;可以被共享(因为它是无状态的) 。     无状态Bean不会"专门"保存客户端的状态----(需要强调“专门”是因为无状态会话Bean也会有成

AD921012的博客 976

传智播客java学习--EJB3进阶

我今天学习了徐老师讲的EJB3的知识,我做了简单的笔记:             SLSB无状态会话Bean的编程规则;EJB类编程规则  至少有一个业务接口  必须是具体类.不能是final或抽象的.  必须有空构造  可以是其它sessionbean或pojo的子类    @Stateless    public CustomerManagerBea

253
上一篇: Java Web中的分页显示——在模型中实现
下一篇: 为什么要使用EJB
Java_Web_Book
博客等级 码龄18年 8粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值