Frage

Ich bin vor ein Problem während der Ausführung queries.I die gleiche resultSet und Anweisung für excecuting die ganze queries.Now ich Gesicht einen intermittierenden SqlException sagen, dass die Verbindung bereits closed.Now wir haben entweder getrennte resultSet für jede Abfrage oder haben Sperre wie structure.Can jemand sagen, die better.I denken Einführung Schlösser ist das process.Am ich richtig bremsen?

Update: Um genau sein clear.The Fehler passieren kann, weil der finally-Block aufgerufen wird, bevor alle Abfragen ausgeführt werden sollen, und die Verbindung wird geschlossen und Ausnahme ausgelöst wird.

Das ist die Ausnahme, die ich bekommen

  

java.sql.SQLException: Verbindung hat   bereits geschlossen. beim   weblogic.jdbc.wrapper.PoolConnection.checkConnection (PoolConnection.java:81)     beim   weblogic.jdbc.wrapper.ResultSet.preInvocationHandler (ResultSet.java:68)     beim   weblogic.jdbc.wrapper.ResultSet_com_informix_jdbc_IfxResultSet.next (Unbekannt   Quelle) bei   com.test.test.execute (test.java:76)
    beim   org.apache.struts.action.RequestProcessor.processActionPerform (RequestProcessor.java:413)     beim   org.apache.struts.action.RequestProcessor.process (RequestProcessor.java:225)     beim   org.apache.struts.action.ActionServlet.process (ActionServlet.java:1858)     beim   org.apache.struts.action.ActionServlet.doPost (ActionServlet.java:459)     beim   javax.servlet.http.HttpServlet.service (HttpServlet.java:760)     beim   javax.servlet.http.HttpServlet.service (HttpServlet.java:853)     beim   weblogic.servlet.internal.ServletStubImpl $ ServletInvocationAction.run (ServletStubImpl.java:1077)     beim   weblogic.servlet.internal.ServletStubImpl.invokeServlet (ServletStubImpl.java:465)     beim   weblogic.servlet.internal.ServletStubImpl.invokeServlet (ServletStubImpl.java:348)     beim   weblogic.servlet.internal.WebAppServletContext $ ServletInvocationAction.run (WebAppServletContext.java:7047)     beim   weblogic.security.acl.internal.AuthenticatedSubject.doAs (AuthenticatedSubject.java:321)     beim   weblogic.security.service.SecurityManager.runAs (SecurityManager.java:121)     beim   weblogic.servlet.internal.WebAppServletContext.invokeServlet (WebAppServletContext.java:3902)     beim   weblogic.servlet.internal.ServletRequestImpl.execute (ServletRequestImpl.java:2773)     beim   weblogic.kernel.ExecuteThread.execute (ExecuteThread.java:224)     beim   weblogic.kernel.ExecuteThread.run (ExecuteThread.java:183)

Beispielcode:

ResultSet rst=null; 
Statement stmt=null; 
Connection con=DBConnection.getConnection();
 stmt=con.createStatement();
 rst=stmt.executeQuery("select * from dual");
 while(rst.next())
 { : ://Some code } 
rst=stmt.executeQuery("select * from doctor where degree="BM");
 while(rst.next())
 { //blah blah } 
finally
 { 
//close con,rst and stmt 
} 
War es hilfreich?

Lösung

Sie werden die Suchresultates nicht wiederverwenden, Sie sind undicht Resultsets. rst = stmt.executeQuery ... erzeugt einen neuen Suchresultates und die vorherige resultset ist nie geschlossen: (

Andere Tipps

Es scheint, dass der Code in Frage hat Probleme in Multi-Threaded-Umgebung.

DBConnection.getConnection () zurückkehrt wahrscheinlich die gleiche Verbindung zu allen Themen. Wenn mehrere Threads mehrere Anforderungen verarbeiten, dass der erste Thread beendet die Ausführung des Verfahrens wird die Verbindung schließen, alle anderen Threads hoch und sundry verlassen.

Ich bin zu spekulieren hier, aber scheint, dass das Verbindungsobjekt zurückgegeben durch DBConnection ist eine Instanz Mitglied des DBConnection Objekts, und das wäre als eine schlechte Praxis für einen Verbindungs-Manager in einer multi-threaded Umgebung zu qualifizieren.

Ein Code fix wäre die Verwendung von Instanzmitgliedern für Verbindung vermeiden, Statement (und dergleichen) und die ResultSet-Objekte.

Ich bin nicht sicher, was los ist, ohne mehr über Ihren Code zu kennen. Ist es threaded? Ist die zugrunde liegende Datenbank geht nach unten (oder Sie verlieren Konnektivität dafür).

Eine Sache, die ich tun würde, ist das Verbindungsspooling zu implementieren (via Apache DBCP , sagen). Dieser Rahmen wird einen Pool von Verbindungen zu Ihrer Datenbank und validate diese Verbindungen vor Aushändigung sie zu Ihnen halten. Sie würden jedes Mal für eine neue Verbindung bitten machen Sie eine Abfrage (oder vielleicht von Abfragen festgelegt), sondern weil sie gebündelt sind dies sollte kein großes oeverhead sein.

Es sei denn, Ihre Verbindung zur Datenbank wirklich geschlossen war ich glaube, Sie etwas mehr wie das getan haben:

try {
    return resultSet.getBoolean("SUCCESS");
} finally {
    resultSet.close();
}

Dieser Code wird tatsächlich in der Nähe der Verbindung vor der Ergebnismenge ausgewertet wird, was zu einer Ausnahme Sie zeigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top