获取java.sql.SQLException:ResultSetclosures后不允许操作

当我执行下面的代码时,我得到一个exception。 我认为这是因为我正在准备与他相同的连接对象的新声明。 我应该如何重写这个,以便我可以创build一个准备好的声明,并得到使用rs2? 即使连接到同一个数据库,我是否也必须创build一个新的连接对象?

try { //Get some stuff String name = ""; String sql = "SELECT `name` FROM `user` WHERE `id` = " + userId + " LIMIT 1;"; ResultSet rs = statement.executeQuery(sql); if(rs.next()) { name = rs.getString("name"); } String sql2 = "SELECT `id` FROM `profiles` WHERE `id` =" + profId + ";"; ResultSet rs2 = statement.executeQuery(sql2); String updateSql = "INSERT INTO `blah`............"; PreparedStatement pst = (PreparedStatement)connection.prepareStatement(updateSql); while(rs2.next()) { int id = rs2.getInt("id"); int stuff = getStuff(id); pst.setInt(1, stuff); pst.addBatch(); } pst.executeBatch(); } catch (Exception e) { e.printStackTrace(); } private int getStuff(int id) { try { String sql = "SELECT ......;"; ResultSet rs = statement.executeQuery(sql); if(rs.next()) { return rs.getInt("something"); } return -1; }//code continues 

问题是你在getStuff()获取数据的方式。 每次访问getStuff()都会获得一个新的ResultSet但不会closures它。

这违反了Statement类的期望(参见http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html ):

默认情况下,每个Statement对象只能同时打开一个ResultSet对象。 因此,如果一个ResultSet对象的读取与另一个ResultSet对象的读取交错,每个必须由不同的Statement对象生成。 Statement接口中的所有执行方法隐式地closures一个statment的当前ResultSet对象(如果存在一个打开的对象)。

更糟糕的是来自调用代码的rs 。 它也是从statement字段中派生出来的,但是并没有closures。

底线:你有几个ResultSet属于同时打开的同一个Statement对象。

当生成它的Statement对象closures,重新执行或用于从多个结果序列中检索下一个结果时,ResultSet对象会自动closures。

我想while(rs2.next())你正试图从rs1访问的东西。 但是自从你重新执行语句来获取rs2之后它就已经closures了。 既然你没有closures它,我相信它在下面再次使用。