- PR -

Oracle JDBCドライバのメモリリークについて

投稿者投稿内容
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-01-26 12:36
引用:

未記入さんの書き込み (2008-01-24 21:47) より:
引用:

JDBCの仕様上はcloseを呼び出さなくても大丈夫とあっても、実装がそうなってるとは限らないのでcloseは呼んでおいたほうが確実です。

ConnectionPoolingを使用してる場合は、コネクションのcloseをしても、実際のDBとの接続は閉じないので、closeを呼び出してないStatementやResultSetのリソースが残っても不思議じゃないかもですね。


そうなんですよね。
私も自分でコーディングする時は、必ずStatementとResultSetの両方をcloseするのですが、今回は引き継いだシステムがStatementしかcloseされていなかったので、これで大丈夫なのかな、と不安になっていました。


interface や抽象 class 上で、ResultSet を close しなくても良い規約なのに、ある特定の具象クラスを使うときは close しなければいけない、ということだとしたら、これはどう考えても変なことだと思うのですが、これはバグではないのでしょうか?
もし、バグだとしても規約(JDBC の仕様)のバグなのか、Oracle の JDBC ドライバーの実装のバグなのか、のどっちなのか、という問題はさらにあるとは思います。
それとも JDBC はそこまでは細かく決めてないよ、だから Oracle の実装もバグではない、というような話なのでしょうか。

規約でテストケースを定めてあるとありがたいと思います。たとえば、このコードで JDBC ドライバーを呼び出しても、メモリーリークを起こしてはいけない(あるいは起こすことは許容する)、のようになどです。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-01-26 12:50
一般に、ソフトウェアで「しなくても良いはずなんだけどしたほうが良い」の類のことに遭遇したら、いわゆる危険な匂いがする、と言えると思います。
未記入
会議室デビュー日: 2008/01/17
投稿数: 12
投稿日時: 2008-01-28 22:47
引用:

引用:
--------------------------------------------------------------------------------


思い出しました。

件名:急にレスポンスが遅くなる
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=10297&forum=12

です。4年前ですね。
私は、内容は良く理解できていないのですが、Statement, ResultSet, close, JDBC, Oracle といったキーワードが出てきています。

--------------------------------------------------------------------------------


そうですね。JDBCのメモリリークが話題になっていますね。
SUNのAPI上では、StatementをcloseするとResultSetを自動的にcloseする事になっているが、Oracle JDBCはStatementをcloseしてもResultSetを操作できてしまうと言うのは、結局はOracle JDBCではResultSetは自動的にcloseされないということなのでしょうね。
私も時間を見つけて検証してみたいと思います。


検証してみました。
バージョンによる違いはあるかもしれませんが、私の環境ではStatementをcloseするとResultSetもcloseされました。
ただ、ご意見があった通り、ResultSetも明示的にcloseするのが一番安全ではあるのでしょうね。
皆様、ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)