現在、サーブレットに注入されるステートフル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のインスタンスごとにデータベース接続を繰り返し開いたり閉じたりするのは非常に非効率的です。