ResultSet关闭后不允许操作

好吧,在过去的两天里,我一直试图解决这个问题。

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

这是查询方法。

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

我该如何解决这个错误?

很难从你发布的代码中确定,但我怀疑ResultSet while循环体内无意中被关闭(或stm被重用)。 这将在下一次迭代开始时触发exception。

此外,您需要确保应用程序中没有其他线程可能使用相同的DB连接或stm对象。

恕我直言,在关闭连接之前,您应该使用ResultSet完成所需的一切。

你需要修理的东西很少。 打开连接,运行查询以获取rs,关闭它以及关闭连接都应尽可能在相同的函数范围内完成。 从您的代码中,您似乎使用“con”变量作为全局变量,这可能会导致问题。 你没有关闭stm对象。 或rs对象。 即使没有错误,此代码也不会运行太长时间。 你的代码应该是这样的:

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

在内部循环中使用另一个Statement对象

 Statement st,st1; st=con.createStatement(); st1=con.createStatement(); //in Inner loop while(<>) { st1.executeQuery(<>); } 

我知道这已经晚了几年,但我发现同步db方法通常可以解决这个问题。