fc2ブログ

データベースと切断

  • Posted by: servletmania
  • 2011-01-10 Mon 21:08:27
  • JDBC




データベースとの切断についてのコードは、
  con.close();
というのがそれにあたるのですが、実はこれだけでは切断が確実に行われるかどうか心配な面があります。

1回でプログラムが終了してしまうような簡単なアプリケーションであれば問題はないのですが、Webアプリケーションのようにプログラムが起動しっぱなしで、頻繁にSQL更新が行われるような場合、データベースの切断ができずリソースを開放し損なうと、徐々にリソースが枯渇していき、システムのパフォーマンスの低下やハングアップ・停止を招きます。

そこで、データベースを利用するプログラムでは、データベースとの接続が確実に切断されるようなソースにしなければなりません。このように確実に行いたい処理があるときは、finallyブロックを使ったソースを書きます。


package dbjava;

import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException; //(1)

public class DBManager {

public static Connection testConnection(){
try{
Class.forName("org.hsqldb.jdbcDriver");
Connection con=DriverManager.getConnection(
"jdbc:hsqldb:hsql://localhost","sa","");
return con;
}catch(Exception e){
throw new IllegalStateException(e);
}
}

public static void main(String[] args) throws Exception{

Connection con=null; //(2)

try{ //(3)
con=testConnection();
System.out.println("con="+con);
con.close();
}

finally{ //(3')
if(con !=null){
try{
con.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}

}


さて、上のソースがDBManager.javaをデータベースとの接続を確実に行うようにした用意周到なソースです。

(1) まず、SQLExceptionの例外が投げられることがあるので、java.sql.SQLException のインポートを行います。

(2) Connectionオブジェクトの初期値をnullにしておきます。データベースとの接続があったらnullでないということにしておけば、データベースと接続しているのかどうかの判定が可能になります。

(3) データベースに関する操作はすべてtry文の中で行い、それに対応する finallyブロック内で接続の切断を行います。finallyブロック内では、例外が発生するかどうかに関係なく、メソッド内で最後に必ず処理が行われます。

finally文の中では、データベースとの接続が継続していた場合に備えてダメ押しの切断がtry文中で行われ、close()メソッドのエラーで SQLExceptionが発生してしまった場合は、エラーの内容が出力されるようになっています。

printStackTrace()メソッドは、投げられた例外の「例外クラス名」、コンストラクタで渡された「例外の説明」、呼び出し元メソッドとファイル名及び行番号(つまり「スタックトレース」)、「Caused by」の4つを標準エラー出力に出力してくれる便利なメソッドです。

スポンサーサイト



タグ :

Return to page top

Comments:

Comment Form
Only inform the site author.

Trackback+Pingback:

TrackBack URL for this entry
http://servletmania.blog137.fc2.com/tb.php/37-03b635c1
月別アーカイブ
カテゴリ
リンク
RSSリンクの表示
QRコード
QR