ResultSet关闭后不允许操作

时间:2012-06-07 14:01:38

标签: java sql select 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;
    }

如何解决此错误?

5 个答案:

答案 0 :(得分:5)

很难确定您发布的代码,但我怀疑ResultSet无意中被关闭(或stm正在被重复使用) while循环。这将在下一次迭代开始时触发异常。

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

您需要解决的问题很少。打开连接,运行查询以获取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);
}

答案 3 :(得分:2)

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

Statement st,st1;

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

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

答案 4 :(得分:1)

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