2012-06-07 14 views
6

Allright versucht, dies in den letzten 2 Tagen herauszufinden.Operation nicht erlaubt, nachdem ResultSet geschlossen

Statement statement = con.createStatement(); 
         String query = "SELECT * FROM sell"; 
         ResultSet rs = query(query); 
         while (rs.next()){//<--- I get there operation error here 

Dies ist die Abfrage-Methode.

public static ResultSet query(String s) throws SQLException { 
     try { 
      if (s.toLowerCase().startsWith("select")) { 
       if(stm == null) { 
        createConnection(); 
       } 
       ResultSet rs = stm.executeQuery(s); 
       return rs; 
      } else { 
       if(stm == null) { 
        createConnection(); 
       } 
       stm.executeUpdate(s); 
      } 
      return null; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      con = null; 
      stm = null; 
     } 
     return null; 
    } 

Wie kann ich diesen Fehler beheben?

+3

Gibt es andere Threads in Ihrer Anwendung? – NPE

+0

Es wäre nützlich, wenn Sie den tatsächlichen Fehler posten, den Sie bekommen. Leute können nicht wirklich mit Problemen ohne eine Beschreibung dessen, was passiert, helfen. Ich sehe auch nie, wo in der "Abfrage" -Methode Sie die Verbindung oder Aussage erstellen. Ich sehe einen Aufruf von createConnection(), aber keine Zuweisung dort und keine Zuweisung von "stm" innerhalb dieser Methode. – Matt

Antwort

5

Es ist schwer, sicher zu sein, nur aus dem Code, den Sie geschrieben haben, aber ich vermute, dass die ResultSet versehentlich geschlossen zu werden (oder stm wiederverwendet zu werden) im Inneren des Körpers des while Schleife. Dies würde die Ausnahme zu Beginn der folgenden Iteration auslösen.

Darüber hinaus müssen Sie sicherstellen, dass keine anderen Threads in Ihrer Anwendung vorhanden sind, die möglicherweise die gleiche DB-Verbindung oder das gleiche stm-Objekt verwenden.

+0

ist es wert. Code ist schmutzig geschrieben und unnötig kompliziert geschrieben. – Sajmon

3

IMHO, Sie sollten alles tun, was Sie mit Ihrem ResultSet benötigen, bevor Sie Ihre Verbindung schließen.

2

gibt es einige Dinge, die Sie beheben müssen. Das Öffnen einer Verbindung, das Ausführen einer Abfrage zum Abrufen der RS, das Schließen der Verbindung und das Schließen der Verbindung sollten soweit wie möglich im gleichen Funktionsumfang erfolgen. In Ihrem Code scheinen Sie die Variable "con" als globale Variable zu verwenden, die möglicherweise ein Problem verursacht. Sie schließen das stm-Objekt nicht. oder das rs-Objekt. Dieser Code wird nicht zu lange ausgeführt, auch wenn er keine Fehler enthält. Der Code sollte so aussehen:

if (stringUtils.isBlank(sql)){ 
    throw new IllegalArgumentsException ("SQL statement is required"); 
} 
Connection con = null; 
PreparedStatement ps =null; 
Resultset rs = null; 
try{ 
     con = getConnection(); 
     ps = con.preparestatement(sql); 
     rs = ps.executeQuery(); 
     processResults(rs); 
     close(rs); 
     close(ps); 
     close(con); 
}catch (Execption e){ 
     log.Exception ("Error in: {}", sql, e); 
     throw new RuntimeException (e); 
}finally{ 
     close(rs); 
     close(ps); 
     close(con); 
} 
2

Verwendung ein anderes Statement-Objekt in der inneren Schleife Wie

Statement st,st1; 

st=con.createStatement(); 
st1=con.createStatement(); 

//in Inner loop 
while(<<your code>>) 
{ 
    st1.executeQuery(<<your query>>); 
} 
1

Ich weiß, dass dies ein paar Jahre zu spät, aber ich habe festgestellt, dass die Synchronisierung der DB-Methoden in der Regel befreie dieses Problem.