2012-06-07 17 views
6

Muy bien estado tratando de resolver esto los últimos 2 días.Operación no permitida después de que ResultSet cerró

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

Este es el método de consulta.

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

¿Cómo puedo reparar este error?

+3

¿Hay algún otro subproceso en su aplicación? – NPE

+0

Sería útil si publica el error real que está recibiendo. La gente no puede ayudar con los problemas sin una descripción de lo que está sucediendo. Tampoco veo dónde en el método de "consulta" está creando la conexión o declaración. Veo una llamada a createConnection(), pero no hay ninguna asignación allí, y ninguna asignación de "stm" dentro de ese método. – Matt

Respuesta

5

Es difícil estar seguro sólo por el código que has publicado, pero sospecho que la ResultSet inadvertidamente está consiguiendo cerrado (o stm está siendo reutilizado) el interior del cuerpo del bucle while. Esto desencadenaría la excepción al comienzo de la siguiente iteración.

Además, debe asegurarse de que no haya otros subprocesos en su aplicación que podrían estar utilizando la misma conexión DB o el objeto stm.

+0

vale la pena. El código está sucio y escrito innecesariamente complicado. – Sajmon

3

En mi humilde opinión, debe hacer todo lo que necesita con su ResultSet antes de cerrar su conexión.

2

hay algunas cosas que debe corregir. Al abrir una conexión, ejecutar una consulta para obtener el rs, cerrarlo y cerrar la conexión, todo debe hacerse en el mismo alcance de la función en la medida de lo posible. de su código, parece que usa la variable "con" como variable global, lo que podría causar un problema. no estás cerrando el objeto stm. o el objeto rs. este código no se ejecuta por mucho tiempo, incluso si no tiene errores. El código debe ser como este:

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

uso Declaración otro objeto en bucle interior Como

Statement st,st1; 

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

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

sé que esto es un par de años de retraso, pero he encontrado que la sincronización de los métodos generalmente db deshazte de este problema

Cuestiones relacionadas