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

Spring 的并发问题 - 有状态 Bean 和无状态 Bean 当多个线程同时访问有状态Bean时,可能会引发并发问题,因为每个线程可能会访问和修改相同的状态数据,导致数据不一致或竞态条件。通过将有状态Bean的方法标记为事务,可以在方法执行期间启用数据库事务,从而避免数据并发访问的问题。在Spring框架中,通过合理地设计Bean的作用域(Scope)和避免在有状态Bean中保存状态信息,可以有效地处理并发问题。通过选择适当的作用域,可以在一定程度上控制有状态Bean的生命周期和访问范围,减少并发问题的影响。尽量设计有状态Bean,使其尽可能避免共享状态数据。 阅读详情

 

有状态会话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... 阅读详情

相关推荐

别再死磕USB HID了!用ESP32的Arduino框架手把手教你实现蓝牙鼠标键盘(附完整代码)

本文详细介绍了如何使用ESP32的Arduino框架实现蓝牙HID设备,包括鼠标和键盘的快速开发。通过现成的库和示例代码,开发者可以轻松打造自定义蓝牙外设,无需复杂的USB HID协议栈,适用于演示控制器、宏键盘等多种场景。

weixin_31309419的博客 261

spring的bean的作用域

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

disuoxia5722的博客 284

非华为电脑与MatePad Pro多屏协同实战:从安装管家到攻克连接难题

本文详细介绍了在非华为电脑上安装华为电脑管家并实现与MatePad Pro多屏协同的完整指南。从安装步骤、常见连接失败解决方案到华为账号绑定技巧,提供了实用的操作方法和硬件优化建议,帮助用户攻克连接难题,提升多屏协同的稳定性和流畅度。

weixin_30263073的博客 234

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

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

lingxiao301415的专栏 1万+

使用Kettle进行数据同步(增量)

文章目录kettle介绍kettle安装kettle使用使用kettle同步关系型数据库数据(MySQL示例)1. 创建一个转换2. 选择表输入3. 格式转换4. 执行脚本5. 创建job使用kettle同步NoSql数据(MongoDB示例)创建转换时的注意事项MongoDBInput怎么创建job的创建如何在Linux上面运行已经创建好的job?1、把创建好的job传输到Linux机器上面2、编辑kjb文件3、执行任务 kettle介绍 Kettle 是一款国外开源的 ETL 工具,纯 Java 编写

JenKin的博客 7351

自动驾驶中的多传感器融合实战:用卡尔曼滤波搞定毫米波雷达与摄像头航迹对齐

本文深入探讨了自动驾驶中多传感器融合的实战技术,重点介绍了如何使用卡尔曼滤波实现毫米波雷达与摄像头的航迹对齐。通过分析传感器特性差异、时空同步挑战及工程化实现步骤,提供了包括状态向量定义、观测矩阵设计和故障检测机制在内的完整解决方案,最终实现0.15米以内的高精度航迹对齐。

weixin_28728495的博客 411

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

Open3D (C++)球旋转算法(BPA)三维建模

球旋转算法用于点云三维建模的C++代码实现。

点云侠的博客 1771

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

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

路远,漫步前行 1147

YOLOv12改进策略【损失函数篇】| 替换Powerful-IoU(PIoU),增强对中等质量锚框的关注力,引导锚框更直接、高效地回归

本文针对现有基于IoU的损失函数在目标检测任务中存在的问题,提出了利用Powerful-IoU(PIoU)及其升级版PIoU v2改进YOLOv12的损失函数,以提高模型精度。文章详细介绍了PIoU和PIoU v2的结构原理,并提供了在YOLOv12中实现这些损失函数的具体步骤和代码修改方法。

Limiiiing的博客 931

EDEM-fluent耦合时出现的问题及摸索出的解决办法及DPM颗粒信息导出

EDEM-fluent耦合时出现的问题及摸索出的解决办法及DPM颗粒信息导出

zheaa的博客 5750

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

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

NJU phd 在读。 677

FC7300 Clock介绍

FC7300的时钟架构包括一个高级时钟图和内部时钟需求。它有5个CMU,使用SIRC监控FIRC/SOSC/FOSC,并使用FIRC监控SIRC。此外,CMU4还使用FOSC监Slow Clock。

舊梦的博客 327

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

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

teedry的专栏 667

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

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

chenfeng0104的专栏 287

假人有限元模型

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

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

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

quliangjun的专栏 223

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

有状态sessionbean 无状态sessionbean

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

hippoppower的专栏 6700

有状态bean 和 无状态bean

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

AD921012的博客 976

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

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

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

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

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

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值