- ベストアンサー
メモリリーク(?)時にSQLException
- java+mysqlでWebアプリを作成中ですが、DBからデータ取得後にSQLExceptionが発生します。
- 取得結果をStringに格納するときにエラーが発生しており、ResultSetがクローズされているというエラーメッセージが表示されます。
- メモリリークが発生しているのかもしれませんが、エラーが2回に1回だけ発生する点が謎です。javaやjdbcのバグの可能性も考えられます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
java のgcがResultSetを消しちゃうと言う様な話は、聞いた事がありませんが、 ResultSet自体が、時間切れや、過負荷時に、自動的にクローズされると言う 事なら、ありえるかと思います。 ResultSet自体の実装として、TCP/IP等による、ソケット接続を内部的に行っ ている可能性がありますからねぇ。
その他の回答 (4)
- askaaska
- ベストアンサー率35% (1455/4149)
> 変数rsは使う前に毎回初期化していますので、問題ないかと思います。 どう初期化しているのかわからないけど 「~思います」がついているうちは疑ってかかるわよ。 私はResultSetの使い方を疑っているわ。 closeされた後のResultSetに対し何かやっているんじゃないか、ってね。 そのひとつが変数rsの再利用だったわけ。 もう一度、なにか思い込みでやっているところがないか 見直してみるべきよ。
- Lieserl
- ベストアンサー率81% (31/38)
PreparedStatementを使い回ししている可能性はありませんか? 参考URLより: デフォルトでは、Statement オブジェクトごとに 1 つの ResultSet オブジェクトだけが同時にオープンできます。 rsやpstがスレッドセーフでは無いのに、他のスレッドから(他のリクエストから)サーブレットが呼ばれていませんか?
- askaaska
- ベストアンサー率35% (1455/4149)
このコードだけじゃわからないけど 他の回答者とは別の視点から仮説。 変数rsを同じスレッド内で再利用していない?
お礼
変数rsは使う前に毎回初期化していますので、問題ないかと思います。 回答ありがとうございます。
- hrm_mmm
- ベストアンサー率63% (292/459)
>while (rs.next()) rsはResultSetクラスですかね。java.sql のクラスは使ったことがないけど、 Iteratorを実装しているなら、次が有るかどうかは、hasnext() でチェックして、 次があれば、ifブロック内で next() でobject を得て作業という手順のはず。 次があるかのチェックもしないで、next() を繰り返せば、当然いつかは、「データを得られなかった → Operation not allowed after ResultSet closed」というエラーになる。
補足
回答ありがとうございます。 また、説明不足で申し訳ありません。ご指摘の通り、rsはResultSetです。 しかし、ResultSetはnext()で次が無かったらfalseを返すので、 >while (rs.next()) は問題ないかと思います。 ご指摘にあるように「いつか必ずエラーになる」のではなく、2回に1回のみエラーになっています。
お礼
>ResultSet自体が、時間切れや、過負荷時に、自動的にクローズされると言う >事なら、ありえるかと思います。 なるほど。 1/2の確立でしかエラー発生しないことを考えると可能性としては低い気もしますが、その線で調べてみます。ありがとうございます!