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

简介:   EJB中的会话Bean(Session Bean)分为有状态的(Stateful)会话Bean和无状态的(Stateless)会话Bean。  对象的状态是由其实例变量(即成员变量)的值组成的

 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可以被无限复用,性能比较高,但却不能保证保存每个用户的状态。各有利弊。


相关文章
|
存储 JSON 安全
解锁互联网安全的新钥匙:JWT(JSON Web Token)
解锁互联网安全的新钥匙:JWT(JSON Web Token)
514 0
|
存储 开发工具 git
helm v2 源大全
helm v2 源大全
|
存储 SQL 关系型数据库
关系型数据库和非关系型数据库的区别和选择方法?
【8月更文挑战第17天】关系型数据库和非关系型数据库的区别和选择方法?
933 0
|
Java 编译器 程序员
Java异常处理和最佳实践(含案例分析)
如何处理Java异常?作者查看了一些异常处理的规范,对 Java 异常处理机制有更深入的了解,并将自己的学习内容记录下来,希望对有同样困惑的同学提供一些帮助。
13431 3
Java异常处理和最佳实践(含案例分析)
|
JavaScript 前端开发 IDE
【TypeScript技术专栏】TypeScript与Node.js后端开发
【4月更文挑战第30天】TypeScript在Node.js后端开发中日益重要,作为JavaScript超集,它提供静态类型检查和面向对象编程,增强代码可靠性和维护性。集成TypeScript能带来类型安全、更好的IDE体验、易于维护的代码以及增强工具支持。通过安装TypeScript编译器、编写TypeScript文件、配置TSconfig,开发者可以在Node.js项目中利用其高级特性,提高代码质量和开发效率。实践案例显示,TypeScript能确保路由处理器的类型正确,降低错误率。随着社区发展,TypeScript成为提升Node.js开发体验的推荐选择。
498 0
|
存储 数据挖掘 数据库
InfluxDB的连续查询与数据聚合技术详解
【4月更文挑战第30天】InfluxDB的连续查询(CQ)功能用于自动定时聚合时间序列数据,适用于数据降采样、实时分析和告警通知等场景。CQ使用InfluxQL编写,例如,每1小时对`cpu_usage`测量值计算主机的平均CPU使用率并存入`cpu_usage_hourly`。InfluxDB提供多种聚合函数如`MEAN()`, `MAX()`, 支持滑动窗口聚合等复杂操作,助力时间序列数据分析和趋势预测。通过CQ,用户能高效管理和利用时间序列数据信息。
1219 0
使用SnakeYaml进行解析时,忽略yaml中无法在类中找到属性的字段
使用SnakeYaml进行解析时,忽略yaml中无法在类中找到属性的字段
|
存储 算法
手把手学会DFS (递归入门)
DFS的思想,经典题目的讲解,手把手入门✨✨
505 0
手把手学会DFS (递归入门)
|
物联网 API 开发者
3_2_AliOS Things 命令行介绍|学习笔记
快速学习3_2_AliOS Things 命令行介绍。
440 0
3_2_AliOS Things 命令行介绍|学习笔记