【发布时间】: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