我们目前有一个注入到 Servlet 中的 Stateful bean。问题是有时我们Caused by: javax.ejb.ConcurrentAccessException: SessionBean is executing another request. [session-key: 7d90c02200a81f-752fe1cd-1]
在有状态 bean 上执行方法时会遇到错误。
public class NewServlet extends HttpServlet {
@EJB
private ReportLocal reportBean;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
String[] parameters = fetchParameters(request);
out.write(reportBean.constructReport(parameters));
} finally {
out.close();
}
}
}
在上面的代码中,constructReport
将检查它是否需要打开到报告中指定的数据库的新连接,然后根据指定参数构建的查询构建 HTML 格式的报告。
我们之所以选择使用有状态 bean 而不是无状态 bean,是因为我们需要打开与未知数据库的数据库连接并对其执行查询。对于无状态 bean,重复打开和关闭与每个注入的 bean 实例的数据库连接似乎非常低效。