- PR -

JDBC接続の解除について

1
投稿者投稿内容
たか
会議室デビュー日: 2004/10/22
投稿数: 4
投稿日時: 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のプロセス解除を行っていると考えて良いのでしょうか?
(上記の障害は別の要因と考えてよいのでしょうか?)

すみませんが、どなたか知恵をお貸し下さい。

MARU
常連さん
会議室デビュー日: 2005/02/16
投稿数: 35
投稿日時: 2005-08-03 12:16
java.sql.ConnectionのJavaDoc
↑には
引用:

ガベージコレクトされるときに自動的にクローズされ、
特定の致命的エラーの場合も、Connection オブジェクトはクローズされるという記述があったのですが、


という記述は見あたらないのですが…

Connectionはあくまでインターフェイスなので実装はJDBCベンダに依存するのですが
少なくともOracleはclose()を明示的に読んでやらないと駄目なはずです。

間違ってたらすみません。
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2005-08-03 12:24
問題ありまくりです。
確かに、GCの際に切断するJDBC実装もあるかもしれませんが、それに依存するのはよろしくないと思います。

私もいくつかプロジェクトを渡ってきましたが、ほとんどのプロジェクトで
コネクションのクローズ漏れによる問題が起こりました。
# また、クローズしていない個所を探すのが面倒なんですよ...

今はコネクションのオープン・クローズはフレームワーク内に隠蔽して
各アプリケーションコードでは意識しなくて済むようにすべきと思っています。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-08-03 12:24
引用:

ConnectionインターフェイスでJDBC接続した場合、
close()メソッドを明示的に宣言しなくても問題ないのでしょうか?

最近、システムの調子が悪くなったので調査したところ、
ORACLEでプロセス障害「ORA-00020: maximum number of processes (200) exceeded」が発生していました。
ソースを解析してみたところ、
JDBC接続したままで、close()メソッドの記述がないソースが何個かありました。


必ずcloseを行いましょう。

引用:

J2SEのAPIでConnectionインターフェイスを調べてみたところ、
Connectionインターフェイスは、ガベージコレクトされるときに自動的にクローズされ、
特定の致命的エラーの場合も、Connection オブジェクトはクローズされるという記述があったのですが、
closeメソッドの実装がない場合でも、JDBC接続が自動的にOracleのプロセス解除を行っていると考えて良いのでしょうか?
(上記の障害は別の要因と考えてよいのでしょうか?)


インターフェイスなので、「このような仕様ですよ」と記述されているだけです。
その仕様に沿わない実装であればGCによる解放が行われないでしょうし、
その仕様に沿った実装であることを保障するものでもありません。

またJDBCの実装が仕様に沿っていたとしても、GCによる解放を期待するのは間違いです。
GCはいつ実行されるかわかりませんし保障されていません。
GCが行われなければ接続はいつまでも解放されないことになります。

ちなみにOracleの古いJDBCの実装には不具合があるみたいです。
http://kvasir.skirnir.net/software/java/oracle_jdbc.html
こちらを参考にしてみてください。
1

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