当前位置: 首页 > 知识库问答 >
问题:

无状态bean的行为与有状态会话bean相似-为什么?

归翔
2023-03-14

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

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

2.)在无状态会话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>");

    }

}
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;
    }



}

共有1个答案

万浩淼
2023-03-14

状态完整会话bean保持每个客户机的状态。您看到的状态是保存在无状态会话bean实例上的状态。

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

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

 类似资料:
  • 1)对于上面的代码,如果LogSearchRemote实现bean是有状态的,那么 没有错误,但是如果LogSearchRemote实现bean是无状态的,那么会抛出异常“$Proxy53不能强制转换为hk.gov.ehr.service.tch.als.admin.logsearch.ejb.LogSearchRemote”,为什么? 2)对于有状态会话bean,每次 返回不同的logSearc

  • 对于有状态会话bean(SFSB)和无状态会话bean(SLSB)的用法,我有点困惑。 我知道SFSB与客户保持状态。这很有帮助:什么时候使用有状态会话bean而不是无状态会话bean? 这里和许多其他地方提供的示例是SFSB的购物车。 “如果一个任务需要一系列方法调用(不止一次),并且您需要保留以前的结果以在下一次调用中使用它们,那么就可以使用SFSB”--Source。这将更像是签出(页面之间

  • 我是EJB的新手,最近开始研究EJB(3.0)。我已经使用Java6年了,但以前从未使用过EJB。至少可以说,整个EJB业务的复杂性让我不知所措。我不明白我可以在哪里实际应用一些概念。 在理解无状态会话bean后,我想到的一个问题是,你能不能不要总是用一个没有本地成员的类的共享实例来替换无状态会话bean(实际上使其无状态)?我了解到正在为无状态会话bean进行实例池。如果没有状态,就不能简单地使

  • 有状态会话bean定义如下: 无状态会话bean无状态会话bean不维护与客户端的会话状态。当客户机调用无状态bean的方法时,该bean的实例变量可能包含特定于该客户机的状态,但仅限于调用期间。当方法完成时,客户端特定状态不应保留。然而,客户端可能会更改池化无状态bean中实例变量的状态,并且此状态将保留到下一次调用池化无状态bean时。除了在方法调用期间,无状态bean的所有实例都是等效的,允

  • 问题内容: Java中的无状态Bean不会在两次客户端调用之间保持其状态。因此,简而言之,我们可以将它们视为具有业务方法的对象。每个方法都带有参数并返回结果。调用该方法时,将在执行堆栈中创建一些局部变量。当该方法返回时,将本地对象从堆栈中删除,并且如果分配了一些临时对象,则无论如何都会对其进行垃圾回收。 在我看来,这与通过单独的线程调用同一实例的方法没有什么不同。那么,为什么容器不能使用bean的

  • 问题内容: 有状态会话Bean定义如下: 有状态会话Bean对象的状态由其实例变量的值组成。在有状态会话Bean中,实例变量代表唯一的客户端Bean会话的状态。因为客户端与其bean进行交互(“交谈”),所以这种状态通常称为对话状态。 无状态会话Bean定义如下: 无状态会话Bean无状态会话Bean不会与客户端保持对话状态。当客户端调用无状态Bean的方法时,该Bean的实例变量可能包含特定于该