• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:メモリリーク(?)時にSQLException )

メモリリーク(?)時にSQLException

このQ&Aのポイント
  • java+mysqlでWebアプリを作成中ですが、DBからデータ取得後にSQLExceptionが発生します。
  • 取得結果をStringに格納するときにエラーが発生しており、ResultSetがクローズされているというエラーメッセージが表示されます。
  • メモリリークが発生しているのかもしれませんが、エラーが2回に1回だけ発生する点が謎です。javaやjdbcのバグの可能性も考えられます。

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

  • ベストアンサー
  • Yanch
  • ベストアンサー率50% (114/225)
回答No.2

java のgcがResultSetを消しちゃうと言う様な話は、聞いた事がありませんが、 ResultSet自体が、時間切れや、過負荷時に、自動的にクローズされると言う 事なら、ありえるかと思います。 ResultSet自体の実装として、TCP/IP等による、ソケット接続を内部的に行っ ている可能性がありますからねぇ。

mastema01
質問者

お礼

>ResultSet自体が、時間切れや、過負荷時に、自動的にクローズされると言う >事なら、ありえるかと思います。 なるほど。 1/2の確立でしかエラー発生しないことを考えると可能性としては低い気もしますが、その線で調べてみます。ありがとうございます!

その他の回答 (4)

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.5

> 変数rsは使う前に毎回初期化していますので、問題ないかと思います。 どう初期化しているのかわからないけど 「~思います」がついているうちは疑ってかかるわよ。 私はResultSetの使い方を疑っているわ。 closeされた後のResultSetに対し何かやっているんじゃないか、ってね。 そのひとつが変数rsの再利用だったわけ。 もう一度、なにか思い込みでやっているところがないか 見直してみるべきよ。

  • Lieserl
  • ベストアンサー率81% (31/38)
回答No.4

PreparedStatementを使い回ししている可能性はありませんか? 参考URLより: デフォルトでは、Statement オブジェクトごとに 1 つの ResultSet オブジェクトだけが同時にオープンできます。 rsやpstがスレッドセーフでは無いのに、他のスレッドから(他のリクエストから)サーブレットが呼ばれていませんか?

参考URL:
http://java.sun.com/javase/ja/6/docs/ja/api/java/sql/Statement.html
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.3

このコードだけじゃわからないけど 他の回答者とは別の視点から仮説。 変数rsを同じスレッド内で再利用していない?

mastema01
質問者

お礼

変数rsは使う前に毎回初期化していますので、問題ないかと思います。 回答ありがとうございます。

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.1

>while (rs.next()) rsはResultSetクラスですかね。java.sql のクラスは使ったことがないけど、 Iteratorを実装しているなら、次が有るかどうかは、hasnext() でチェックして、 次があれば、ifブロック内で next() でobject を得て作業という手順のはず。 次があるかのチェックもしないで、next() を繰り返せば、当然いつかは、「データを得られなかった → Operation not allowed after ResultSet closed」というエラーになる。

mastema01
質問者

補足

回答ありがとうございます。 また、説明不足で申し訳ありません。ご指摘の通り、rsはResultSetです。 しかし、ResultSetはnext()で次が無かったらfalseを返すので、 >while (rs.next()) は問題ないかと思います。 ご指摘にあるように「いつか必ずエラーになる」のではなく、2回に1回のみエラーになっています。

関連するQ&A