【问题标题】:Stateless bean behaves like stateful session bean - why?无状态 bean 的行为类似于有状态会话 bean - 为什么?
【发布时间】:2016-04-14 11:50:48
【问题描述】:

我是 JavaEE 的新手,我试图找出无状态会话 bean 和有状态会话 bean 之间的区别。到目前为止我所理解的:

1.) 在 stateful 会话 bean 中,bean 的状态与客户端绑定;因此,只要我们与同一个用户在同一个会话中,bean 实例的状态就应该是相同的

2.) 在 stateless 会话 bean 中,没有状态绑定到会话和客户端;事实上,bean 实例可以在用户的​​每次调用或请求时交换

为了尝试这个,我编写了一个简短的 servlet,它只打印出无状态 bean 上每个请求的命中数。这是 servlet:

package com.java.ee.ejb.stateless;

import java.io.IOException;

import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet
public class StateLessServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @EJB
    private StateLessBean stateLessBean;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        System.out.println(stateLessBean);
        stateLessBean.increaseHits();

        resp.getWriter().write("<h1>Hits: "+stateLessBean.getHits()+"<h1>");

    }

}

这是无状态的 bean:

package com.java.ee.ejb.stateless;

import javax.ejb.Stateless;

@Stateless
public class StateLessBean {

    private int hits;


    public void increaseHits() {
        hits++;
    }


    public int getHits() {
        return hits;
    }



}

但似乎是,我每次都在同一个对象上调用方法 - 不应该完全相反,这意味着当我使用无状态会话 bean 时每次都在不同的实例上调用吗?我忘记了什么吗?

【问题讨论】:

  • 仅仅因为您的测试碰巧总是碰到同一个实例并不意味着它总是如此。开始并发发送许多请求,并在increaseHits() 方法中添加一个 Thread.sleep(5000L) ,您将开始看到差异。
  • 我没试过,它永远不会改变
  • 什么永远不变?因为如果您只查看 servlet 中无状态 bean 引用的 toString(),那将永远不会改变:servlet 是一个单例。在 EJB 方法中打印 this.toString()

标签: java session jakarta-ee stateless


【解决方案1】:

有状态的会话 bean 保持每个客户端的状态。您看到的状态是保存在无状态会话 Bean 实例上的状态。

当您创建无状态会话 Bean 时,应用程序服务器通常会创建这些 bean 的池。我建议您的实现创建一个 1 的池。由于它们是无状态的(您的不是!),这意味着多个线程可以在同一个实例上运行而不会产生任何影响。

由应用服务器决定是否要创建多个无状态会话 bean 实例。

【讨论】:

  • 好的,谢谢,现在我看到了区别!谢谢!通过启动多个线程,我看到当 bean 无状态时使用了不同的实例!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 2014-06-23
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 2017-09-15
  • 2023-03-12
相关资源
最近更新 更多