Wir haben derzeit eine Stateful Bean, die in ein Servlet injiziert wird. Das Problem ist, dass wir manchmal eine Caused by: javax.ejb.ConcurrentAccessException: SessionBean is executing another request. [session-key: 7d90c02200a81f-752fe1cd-1]
bei der Ausführung einer Methode auf der stateful 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();
}
}
}
Im obigen Code, constructReport
prüft, ob eine neue Verbindung zu der im Bericht angegebenen Datenbank geöffnet werden muss, woraufhin ein Bericht in HTML aus einer Abfrage erstellt wird, die aus den angegebenen Parametern besteht.
Der Grund, warum wir uns für eine stateful Bean und nicht für eine stateless Bean entschieden haben, ist, dass wir eine Datenbankverbindung zu einer unbekannten Datenbank öffnen und Abfragen durchführen müssen. Bei einer zustandslosen Bean erscheint es äußerst ineffizient, mit jeder injizierten Instanz der Bean wiederholt Datenbankverbindungen zu öffnen und zu schließen.