2012-06-07 24 views
6

Próbowałem to rozgryźć przez ostatnie 2 dni.Operacja niedozwolona po ResultSet closed

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

To jest metoda zapytania.

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; 
    } 

Jak mogę naprawić ten błąd?

+3

Czy są jakieś inne wątki w swojej aplikacji? – NPE

+0

Przydałoby się, jeśli publikujesz rzeczywisty błąd, który otrzymujesz. Ludzie nie mogą naprawdę pomóc w problemach bez opisu tego, co się dzieje. Nie widzę też miejsca, w którym w metodzie "zapytania" tworzysz połączenie lub instrukcję. Widzę wywołanie createConnection(), ale nie ma tam przypisania i nie ma przypisania "stm" wewnątrz tej metody. – Matt

Odpowiedz

5

Trudno mieć pewność, tylko z kodu już pisał, ale podejrzewam, że ResultSet przypadkowo uzyskiwanie zamknięte (lub stm wychodzi ponownie wykorzystane) wewnątrz korpusu while pętli. Spowoduje to uruchomienie wyjątku na początku kolejnej iteracji.

Należy dodatkowo upewnić się, że w aplikacji nie ma innych wątków, które potencjalnie mogą używać tego samego połączenia DB lub obiektu stm.

+0

to jest warte. Kod jest niepoprawnie napisany i niepotrzebnie skomplikowany. – Sajmon

3

IMHO, powinieneś zrobić wszystko, czego potrzebujesz, z ResultSet, zanim zamkniesz połączenie.

2

Jest kilka rzeczy, które musisz naprawić. Otwieranie połączenia, uruchamianie zapytania, aby uzyskać rs, zamknięcie go i zamknięcie połączenia wszystkie powinny być wykonane w tym samym zakresie funkcji, tak dalece jak to możliwe. z twojego kodu, wydajesz się używać zmiennej "con" jako zmiennej globalnej, która może potencjalnie spowodować problem. nie zamykasz obiektu STM. lub obiekt rs. ten kod nie działa zbyt długo, nawet jeśli nie zawiera błędów. Kod powinien wyglądać następująco:

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

użycie inny komunikat obiektu w pętli wewnętrznej Jak

Statement st,st1; 

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

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

wiem, że to kilka lat spóźnione, ale odkryłem, że metody synchronizacji zazwyczaj db pozbyć się tego problemu.

Powiązane problemy