6

好吧,最近两天一直在尝试解决这个问题。

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

我该如何解决这个错误?

4

5 回答 5

6

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

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

于 2012-06-07T14:06:45.467 回答
4

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

于 2012-06-07T14:22:53.990 回答
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);
}
于 2012-06-07T14:33:14.273 回答
2

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

Statement st,st1;

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

//in Inner loop
while(<<your code>>)
{
   st1.executeQuery(<<your query>>);
}
于 2013-06-30T01:33:15.520 回答
1

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

于 2013-11-22T08:39:12.650 回答