我的servlet抛出异常ResourceClosed

时间:2014-01-17 11:02:19

标签: java mysql hibernate java-ee persistence

三个读取结果的设备同时联系我的servlet。 一件奇怪的事情发生了:第一个设备显示结果,通常是第二个,而第三个设备收到500个内部服务器错误,因为抛出异常 org.hibernate.ResourceClosedException:此TransactionCoordinator已关闭(代码后面显示如下)。 所以,我知道会话是在三个设备共享数据库的情况下启动的,当其中一个设备结束操作并在设备关闭后关闭会话时。为什么会这样?我想为每位导师设一个专门的会议。

@WebServlet("/UpdateTutor")
public class UpdateTutor extends HttpServlet {

Session s;
int i=0;
static Logger log= Log.getLogger(UpdateTutor.class);

public UpdateTutor() {
    super();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String tipo = request.getParameter("tipo");
    String seriale = request.getParameter("seriale");
    PrintWriter out = response.getWriter();
    s = PersistanceSessionFactory.openSession("UpdateTutor"+seriale);
    log.infoServlet("Ricevo una richiesta di aggiornamento sul tutor "+seriale);

    if(seriale==null){
        out.write("No serial");
        s.close();
        return;
    }

    if(tipo==null){
        out.write(notificaAggiornamento(seriale));
        s.close();

    }else{
       out.write(updateAll(seriale));
       s.close();
    }
    return;
}
public String updateAll(String seriale) {
    log.infoServlet("Aggiornamento in corso..stampo lo stato attuale della centrale");
    String out = "";

    /*Addetti*/
    out+="<addetti val = \""+updateAddetti(seriale)+"\"/>\n";
            ..... 
            return out;
}

      public String updateAddetti(String seriale){
       .............
       if(a!=null){
            String den ="";
//Exception org.hibernate.ResourceClosedException: This TransactionCoordinator has been closed
            Azienda az = (Azienda) s.get(Azienda.class, a.getId().getIdAzienda());



public class PersistanceSessionFactory {

private static String TAG = "PersistanceSessionFactory";
private static SessionFactory sf = null;
    .....
    public static Session openSession(String source){
    return sf.openSession();
}
    .....
}

1 个答案:

答案 0 :(得分:0)

Session引用从Class级别移至Method级别。通常,不应该有任何成员影响doGet类级别中doPost / Servlet方法的操作,因为它会导致并发问题,当多个请求已经发生时同时收到每个类加载器只存在一个Servlet实例来处理所有请求。每个请求都将在自己的线程上处理。因此,您不应该关闭会话,因为它处于类级别。将其设为doGet方法的局部变量以避免此错误