无状态bean的行为类似于有状态会话bean - 为什么?

时间:2016-01-09 23:14:21

标签: java session java-ee stateless

我是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>");

    }

}

这是无状态的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时,这意味着每次在不同的实例上调用?我忘记了什么吗?

enter image description here

1 个答案:

答案 0 :(得分:2)

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

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

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