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方法通常可以解决这个问题。