- PR -

コネクションは必ずクローズ?

投稿者投稿内容
Orphan
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 54
投稿日時: 2007-11-30 01:25
public static void main ( String args[] ) {
 try{
  Class.forName( "oracle.jdbc.driver.OracleDriver" );
  Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "tiger" );

  System,exit( 0 );

 } catch( Exception e ) {

  System.exit( 1 );
 }
}

コネクションは必ずクローズしなければいけないのでしょうか?
例えば上記のようにクローズせずにmainメソッドを終了した場合、コネクションはずぅーっと残ったままになってしまうのでしょうか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-11-30 02:24
通常コネクションはプロセスにひもついているのでプロセスが終了すれば自然とクローズされます。
main メソッドでちょっと処理をして exit 、というプログラムであればクローズしなくてもほとんどの場合問題にならないでしょう。

ただし、Java では長期間動作し続けるプログラムを書くことが多いので明示的にクローズしてあげないとコネクションやデータベースサイドのカーソルが残り続けてしまうことになります。
しかし、大抵ガベージコレクションでコネクションオブジェクトが回収されるタイミングで勝手にクローズしてくれるので開発中は問題が顕在化せず、運用を開始して思わぬ負荷がかかって初めて問題が発生するというやっかいな自体に陥りがちです。

簡単なコードを書いているうちから finally ブロック内でしっかりクローズするクセを付けることをお勧めします。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2007-11-30 07:11
セッションは残り続けるので必ずクローズしてください。
クライアント上のコネクションは切断されているように見えていてもORACLEサーバー上のリソースは開放されないはずです。
Orphan
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 54
投稿日時: 2007-11-30 07:55
Connection.close()はExceptionが発生する可能性があると思うのですが、
Exception発生で終了した場合もORACLEサーバー上のリソースは開放されないということでしょうか?
tarnwo
ベテラン
会議室デビュー日: 2002/10/25
投稿数: 58
投稿日時: 2007-11-30 09:09
引用:

Orphanさんの書き込み (2007-11-30 07:55) より:
Connection.close()はExceptionが発生する可能性があると思うのですが、
Exception発生で終了した場合もORACLEサーバー上のリソースは開放されないということでしょうか?



Exceptionにもいろいろあるかと。
たとえば
コード:
conn = null;
conn.close();


この場合、開放されないのでは。
Orphan
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 54
投稿日時: 2007-12-01 02:45
public static void main(String[] args) {
 Connection con = null;
 try {
  Class.forName( "oracle.jdbc.driver.OracleDriver" );
  con = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "tiger" );
 }
 catch( Exception e1 ) {
  while( true ) {
   try {
    if( null != con ) {
     con.close();
     break;
    }
    break;
   }
   catch( Exception e2 ) {
    ;
   }
  }
 }
}

こんなふうにしてみました。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-12-01 03:51
Exceptionなら関係ない例外もキャッチしてしまうので、
明示的にSQLExceptionとしましょう。
ましてや例外の握り潰しもよくないです。
Orphan
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 54
投稿日時: 2007-12-01 05:06
public static void main(String[] args) {
 Connection con = null;
 try {
  Class.forName( "oracle.jdbc.driver.OracleDriver" );
  con = DriverManager.getConnection( jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "tiger" );
 }
 catch( ClassNotFoundException cnfe ) {
  System.out.println( "ClassNotFoundException" );
  while( true ) {
   try {
    if( null != con ) {
     con.close();
     break;
    }
    break;
   }
   catch( SQLException sqle1 ) {
    System.out.println( "SQLException_1" );
   }
  }
 }
 catch( SQLException sqle2 ) {
  System.out.println( "SQLException_2" );
   while( true ) {
    try {
     if( null != con ) {
      con.close();
      break;
     }
     break;
    }
    catch( SQLException sqle3 ) {
     System.out.println( "SQLException_3" );
    }
   }
  }
 }
}

例外の握りつぶし、勉強になります。

Exceptionが発生しなかった場合のcon.close()がないですね^^;
するとそこでまたSQLExceptionの例外処理・・・

[ メッセージ編集済み 編集者: Orphan 編集日時 2007-12-01 13:11 ]

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