【EJB学习笔记】——有状态的会话Bean和无状态的会话Bean

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/50970565

  EJB中的会话Bean(Session Bean)分为有状态的(Stateful)会话Bean和无状态的(Stateless)会话Bean。

  对象的状态是由其实例变量(即成员变量)的值组成的

  有状态的会话Bean:每次访问都会为用户分配一个独立的bean,在用户的生存周期内,bean始终为当前用户保存信息(用户的状态),用户访问结束时,bean的生存周期也随之结束。有状态会话Bean定义的方式是在类头使用注解@Stateful。

  无状态的会话Bean:bean的成员变量保存的信息是所有客户端共享的,不是专门为单独的客户端而保留的。无状态会话Bean定义的方式是在垒头使用注解@Stateless。

举例说明

有状态的会话Bean例子

  接口

public interface StatefulEjb {
public void compute(int i);
public int  getResult();
}

  EJB实现类

@Stateful
@Remote
public class StatefulEjbImpl implements StatefulEjb {
    private int state;
    public void compute(int i) {
        state=state+i;
    }
    public int getResult() {
        return state;
    }
}

  客户端调用

public class StatefulEjbClient{
    public static void main(String[] args) throws Exception {

        InitialContext context=new InitialContext();
        StatefulEjb statefulEjb1=(StatefulEjb)context.lookup("StatefulEjbImpl/remote");         
        for(int i=0;i<10;i++){
            statefulEjb1.compute(1);
            System.out.println("statefulEjb1:"+statefulEjb1.getResult());
        }   

        StatefulEjb statefulEjb2=(StatefulEjb)context.lookup("StatefulEjbImpl/remote");         
        for(int i=0;i<5;i++){
            statefulEjb2.compute(1);
                System.out.println("statefulEjb2:"+statefulEjb2.getResult());
        }
    }   
}

  执行结果

statefulEjb1:1
statefulEjb1:2
statefulEjb1:3
statefulEjb1:4
statefulEjb1:5
statefulEjb2:1
statefulEjb2:2
statefulEjb2:3
statefulEjb2:4
statefulEjb2:5

  由执行结果可以发现,客户端的两个实例分别调用服务端的有状态会话Bean,每次执行时,客户端都“独享”一个EJB实例,每次调用与其他调用之间的数据并不桐乡,互相独立,互不冲突。

无状态的会话Bean例子

  接口

public interface StatelessEjb {
public void compute(int i);
public int  getResult();
}

  EJB实现类

@Stateless
@Remote
public class StatelessEjbImpl implements StatelessEjb{
    private int state;
    public void compute(int i) {
        state=state+i;
    }

    public int getResult() {
        return state;
    }
}

  客户端调用

public class StatelessEjbClient{
    public static void main(String[] args) throws Exception {
        InitialContext context=new InitialContext();
        StatelessEjb statelessEjb1=(StatelessEjb)context.lookup("StatelessEjbImpl/remote");         
        for(int i=0;i<10;i++){
            statelessEjb1.compute(1);
                System.out.println("statefulEjb1:"+statelessEjb1.getResult());
        }       
        StatelessEjb statelessEjb2=(StatelessEjb)context.lookup("StatelessEjbImpl/remote");         
        for(int i=0;i<10;i++){
            statelessEjb2.compute(1);
            System.out.println("statefulEjb2:"+statelessEjb2.getResult());
        }
        System.out.println(statelessEjb1==statelessEjb2);
    }   
}

  执行结果

statefulEjb1:1
statefulEjb1:2
statefulEjb1:3
statefulEjb1:4
statefulEjb1:5
statefulEjb2:6
statefulEjb2:7
statefulEjb2:8
statefulEjb2:9
statefulEjb2:10
false

  由执行结果可以发现,客户端第一个实例statelessEjb1调用时,调用了5次,state的值增加到5;第二个实例statelessEjb2调用时,调用了5次,state的值从5开始增加,一直增加到10。由此可见,这两个实例调用无状态的会话Bean时,这10次调用的其实是一个EJB实例,实例的成员变量也是共享的。

总结

  综上所述,有状态会话Bean可以保存用户状态,但每个用户访问都会实例化一次,会大大降低系统;无状态会话Bean可以被无限复用,性能比较高,但却不能保证保存每个用户的状态。各有利弊。


【 转载请注明出处——胡玉洋《EJB——有状态的会话Bean和无状态的会话Bean》】

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏学海无涯

Java Web之Spring Boot

我一直在尝试一个人写demo(Android和iOS)时,如何模拟服务器端返回的 JSON 数据,总的来说,我试过以下几种: 纯Servlet开发,这种方式配合...

29340
来自专栏阿杜的世界

Spring实战5-基于Spring构建Web应用主要内容

写在前面:关于Java Web,首先推荐一篇文章——写给java web一年左右工作经验的人,这篇文章的作者用精练的话语勾勒除了各种Java框架的缘由和最基本的...

13320
来自专栏Web项目聚集地

从零学习Spring MVC框架「RESTful风格实践」

学习本文章之前,我们需要知道什么是RESTful API,还对此不了解的朋友可以移步历史文章 RESTful 接口实现简明指南 ,简单来说就是就是用URL定位资...

20210
来自专栏互联网大杂烩

Spring MVC框架

前端控制器是DispatcherServlet;应用控制器其实拆为处理器映射器(Handler Mapping)进行处理器管理和视图解析器(View Resol...

8620
来自专栏玩转JavaEE

使用Spring Boot开发Web项目

按:最近公众号文章主要是整理一些老文章,以个人CSDN上的博客为主,也会穿插一些新的技术点。 ---- 前面两篇博客中我们简单介绍了Spring Boot项目的...

31850
来自专栏JAVA同学会

Spring Data(一)概念和仓库的定义

Spring Data的主要任务是为数据访问提供一个相似的、一致的、基于Spring的编程模型,同时又保留着下面各个数据存储的特征。它使得使用数据访问技术非常的...

15210
来自专栏技术博文

file_put_contents— 将一个字符串写入文件

将字符串写入到文件中,我们可以用fwrite写文件函数进行操作,今天写程序的时候,突然觉得其实file_put_contents()函数,用来写入字符串,后来仔...

40470
来自专栏一个会写诗的程序员的博客

Spring FrameWork 5.0 新功能 概览Spring FrameWork 5.0 新功能 概览

整个框架的代码基于java8 通过使用泛型等特性提高可读性 对java8提高直接的代码支撑

9510
来自专栏Java 技术分享

SpringMVC(二)

17730
来自专栏java工会

Spring工作原理

内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、...

8710

扫码关注云+社区

领取腾讯云代金券