• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PreparedStatementについて質問)

PreparedStatementの使い方と注意点

このQ&Aのポイント
  • PreparedStatementを使用する際には、close処理を忘れずに行うことが重要です。
  • close処理が抜けていると、ORA-1000 最大オープン・カーソル数を超えるエラーが発生することがあります。
  • forループ内でのclose処理は避け、ループの外で行うようにしましょう。また、オラクルの設定にも注意が必要です。

質問者が選んだベストアンサー

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.1

classA.updateData() の中身が分からないとハッキリしたことは言えないのですが、エラーメッセージからしてOracleに設定されている最大カーソル数より多くの ResultSet を同時にオープンしているのでしょう。 classA.updateData() の中で PreparedStatement/ResultSet オブジェクトを取得していて、かつ close をしていなければ、少なくとも500個は同時にオープンしていることになるかと。(参照が外れていてGCが走ればそうならない可能性も有りますが) また、classA.close() の中では classA.updateData() で開いた分(500個?)の close を行っているでしょうか? たとえ、一つの PreparedStatement 変数/フィールドしか使っていなくても、複数のオブジェクトを生成している場合はそれぞれのオブジェクトに close が必要となります。 悪い例) -------------------------------------------- PreparedStatement pstmt = null; try { // 1個目の PreparedStatement オブジェクト pstmt = connection.prepareStatement(sql1); ・ ・ ・ // 2個目の PreparedStatement オブジェクト pstmt = connection.prepareStatement(sql2); ・ ・ ・ } finally { pstmt.close(); // 2個目の PreparedStatement しかcloseされない! } ---------------------------------------------------- ※ 簡単にする為に例外処理などは省略しています。 メモリ以外のリソースに関わる PreparedStatement などについては、原則的に一つのメソッド内でオープンとクローズを行うと良いです。どうしても分けなければならない場合も有るでしょうが。

poipoi2011
質問者

お礼

分かりにくい説明にご回答ありがとうございます。 classA.updateData()のなかは、端よって書くと PreparedStatement pstm = con.prepareStatement("UPDATE テーブルA SET 項目A=?"); pstm.setInt(1, 更新値); pstm.executeUpdate(): という感じです。 PreparedStatement,ResultSetで勉強不足で分らないことも多いのですが・・・ 確かに、ループの分だけ「pstmt」が作られます。 ということは、同じSQL文で更新値が違うだけだと if(pstmt!=null){ pstmt = connection.prepareStatement(sql); } とすれば大丈夫ということでしょうか。

関連するQ&A

専門家に質問してみよう