我是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时,这意味着每次在不同的实例上调用?我忘记了什么吗?
答案 0 :(得分:2)
Statefull会话bean保持每个客户端的状态。您所看到的状态是保存在无状态会话Bean实例上的状态。
创建无状态会话Bean时,应用程序服务器通常会创建这些bean的池。我建议你的实现是创建一个1的池。因为它们是无状态的(你的不是!),这意味着多个线程可以在同一个实例上运行而不会产生任何影响。
由应用程序服务器决定是否要创建无状态会话bean的多个实例。