2014-01-17 58 views
0

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

@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(); 
} 
    ..... 
} 

回答

0

Class水平移动Session参照Method水平。一般来说,不应该有影响doGet/doPost类的Servlet类级别的操作的任何成员,因为当同时接收到多个请求时会引起并发问题每个类加载器仅存在一个Servlet实例来处理所有请求。每个请求将在其自己的线程上处理。所以,你不应该关闭会话,因为它在Class级别。将其作为局部变量doGet方法避免此错误

+0

@Saverio它有帮助吗? – Keerthivasan

+1

天啊!我是一个非常粗心的白痴,你是一个非常善良的人。这是问题,现在它起作用了。非常感谢你 –

+0

@SaverioPuccia你非常欢迎! – Keerthivasan