- - PR -
コネクションは必ずクローズ?
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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メソッドを終了した場合、コネクションはずぅーっと残ったままになってしまうのでしょうか? | ||||||||
|
投稿日時: 2007-11-30 02:24
通常コネクションはプロセスにひもついているのでプロセスが終了すれば自然とクローズされます。
main メソッドでちょっと処理をして exit 、というプログラムであればクローズしなくてもほとんどの場合問題にならないでしょう。 ただし、Java では長期間動作し続けるプログラムを書くことが多いので明示的にクローズしてあげないとコネクションやデータベースサイドのカーソルが残り続けてしまうことになります。 しかし、大抵ガベージコレクションでコネクションオブジェクトが回収されるタイミングで勝手にクローズしてくれるので開発中は問題が顕在化せず、運用を開始して思わぬ負荷がかかって初めて問題が発生するというやっかいな自体に陥りがちです。 簡単なコードを書いているうちから finally ブロック内でしっかりクローズするクセを付けることをお勧めします。 | ||||||||
|
投稿日時: 2007-11-30 07:11
セッションは残り続けるので必ずクローズしてください。
クライアント上のコネクションは切断されているように見えていてもORACLEサーバー上のリソースは開放されないはずです。 | ||||||||
|
投稿日時: 2007-11-30 07:55
Connection.close()はExceptionが発生する可能性があると思うのですが、
Exception発生で終了した場合もORACLEサーバー上のリソースは開放されないということでしょうか? | ||||||||
|
投稿日時: 2007-11-30 09:09
Exceptionにもいろいろあるかと。 たとえば
この場合、開放されないのでは。 | ||||||||
|
投稿日時: 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 ) { ; } } } } こんなふうにしてみました。 | ||||||||
|
投稿日時: 2007-12-01 03:51
Exceptionなら関係ない例外もキャッチしてしまうので、
明示的にSQLExceptionとしましょう。 ましてや例外の握り潰しもよくないです。 | ||||||||
|
投稿日時: 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 ] |
1|2|3
次のページへ»