6

この 2 日間、これを理解しようとしてきました。

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

あなたが投稿したコードだけでは確信が持てませんが、 loopの本体内でResultSetが誤って閉じられている (またはstm再利用されている)と思われます。これにより、次の反復の開始時に例外がトリガーされます。while

stmさらに、同じ DB 接続またはオブジェクトを使用している可能性のある他のスレッドがアプリケーションにないことを確認する必要があります。

于 2012-06-07T14:06:45.467 に答える
4

IMHO、接続を閉じる前に、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 オブジェクトを使用する

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 に答える