2012-06-07 24 views
6

最後の2日間はこれを把握しようとしていました。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; 
    } 

このエラーを修正するにはどうすればよいですか?

+3

アプリケーションに他のスレッドはありますか? – NPE

+0

実際のエラーを投稿すると便利です。人々は何が起こっているのかの説明なしで問題を本当に助けることはできません。また、 "照会"メソッドで接続やステートメントを作成する場所を確認することもありません。私はcreateConnection()の呼び出しを見ますが、そこには割り当てはなく、そのメソッドの中には "stm"の割り当てもありません。 – Matt

答えて

5

whileループの体内にそれはちょうどあなたが投稿したコードから確認するのは難しいですが、私はResultSetが誤って閉じてきている(またはstmを再利用しつつある)と思われる。これにより、次の反復の開始時に例外がトリガーされます。

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

+0

それは価値があります。コードは汚れていて、不必要に複雑に書かれています。 – Sajmon

3

IMHOでは、接続を閉じる前にResultSetで必要な処理をすべて行う必要があります。

2

修正する必要があるものはほとんどありません。接続を開いたり、rsを取得するためにクエリを実行したり、rsを終了したり、接続を閉じるには、可能な限り同じ関数スコープで行う必要があります。あなたのコードから、 "con"変数をグローバル変数として使用しているように見えますが、これは潜在的に問題を引き起こす可能性があります。あなたはstmオブジェクトを閉じていません。またはrsオブジェクトです。たとえエラーがなくても、このコードは長時間実行されません。あなたのコードは次のようにする必要があります:

同様
Statement st,st1; 

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

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

は、内側のループ内の別のStatementオブジェクトを使用して、私はこれが遅れて数年ですけど、私は通常デシベルのメソッドを同期することを発見しましたこの問題を取り除く。

1

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); 
} 
関連する問題