- - PR -
JDBC接続の解除について
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-08-03 12:05
以下の現象について何かお気付きの点がありましたらご指摘をお願い致します。
ConnectionインターフェイスでJDBC接続した場合、 close()メソッドを明示的に宣言しなくても問題ないのでしょうか? 最近、システムの調子が悪くなったので調査したところ、 ORACLEでプロセス障害「ORA-00020: maximum number of processes (200) exceeded」が発生していました。 ソースを解析してみたところ、 JDBC接続したままで、close()メソッドの記述がないソースが何個かありました。 J2SEのAPIでConnectionインターフェイスを調べてみたところ、 Connectionインターフェイスは、ガベージコレクトされるときに自動的にクローズされ、 特定の致命的エラーの場合も、Connection オブジェクトはクローズされるという記述があったのですが、 closeメソッドの実装がない場合でも、JDBC接続が自動的にOracleのプロセス解除を行っていると考えて良いのでしょうか? (上記の障害は別の要因と考えてよいのでしょうか?) すみませんが、どなたか知恵をお貸し下さい。 | ||||||||
|
投稿日時: 2005-08-03 12:16
java.sql.ConnectionのJavaDoc
↑には
という記述は見あたらないのですが… Connectionはあくまでインターフェイスなので実装はJDBCベンダに依存するのですが 少なくともOracleはclose()を明示的に読んでやらないと駄目なはずです。 間違ってたらすみません。 | ||||||||
|
投稿日時: 2005-08-03 12:24
問題ありまくりです。
確かに、GCの際に切断するJDBC実装もあるかもしれませんが、それに依存するのはよろしくないと思います。 私もいくつかプロジェクトを渡ってきましたが、ほとんどのプロジェクトで コネクションのクローズ漏れによる問題が起こりました。 # また、クローズしていない個所を探すのが面倒なんですよ... 今はコネクションのオープン・クローズはフレームワーク内に隠蔽して 各アプリケーションコードでは意識しなくて済むようにすべきと思っています。 | ||||||||
|
投稿日時: 2005-08-03 12:24
必ずcloseを行いましょう。
インターフェイスなので、「このような仕様ですよ」と記述されているだけです。 その仕様に沿わない実装であればGCによる解放が行われないでしょうし、 その仕様に沿った実装であることを保障するものでもありません。 またJDBCの実装が仕様に沿っていたとしても、GCによる解放を期待するのは間違いです。 GCはいつ実行されるかわかりませんし保障されていません。 GCが行われなければ接続はいつまでも解放されないことになります。 ちなみにOracleの古いJDBCの実装には不具合があるみたいです。 http://kvasir.skirnir.net/software/java/oracle_jdbc.html こちらを参考にしてみてください。 |
1