データベースに接続したら後始末は確実にJavaTips 〜Javaプログラミング編

» 2006年12月20日 10時00分 公開
[平野正喜@IT]

 プログラムからファイルなどのストレージを用いる場合、ファイル名や存在場所を直接指定する方法では保守性が悪化します。また、本番とテストで違う環境を用いる場合に、思わぬ手間が掛かったり、変更し忘れてトラブルに発展することもあります。

 よって、ストレージへのアクセス方法を標準化し、プログラムの中にはファイル名や存在場所を記述しないことで、環境が変わってもプログラムの変更を発生させないことが望ましいでしょう。そこで、Javaアプリケーションやサーブレットなどからデータベースを活用する場合に用いられるのが、JDBC/ODBC(Java DataBase Connectivity/Open DataBase Connection)です。

 例えば、JDBC/ODBC経由でマイクロソフトのAccessのデータベースに接続する場合、WindowsのODBCデータソースアドミニストレータを使って、「ODBC Microsoft Access セットアップ」画面を呼び出せば、作成したデータベースを登録することができます。プログラムからはこの登録名(データソース名)のみを用いてデータベースに接続し使用しますので、データベースが実際にはどういうファイル名でどこにあるのかは、意識する必要がありません。

 このように、便利で開発効率や保守性を高めるJDBC/ODBCですが、接続の開始と終了を確実に行わないと悪影響が出ることがあります。具体的には、接続の終了におけるステートメント(Statement)オブジェクトとJDBCリソースの解放、および、接続(Connection)オブジェクトの解放とJDBCリソースの解除、という「後始末」です。データベースのリソースを占有するのを避けるために、この後始末は必ず行いましょう。

 例えば、データベースを用いるJavaアプリケーションの例外処理を下記のように安易に組むと、思わぬトラブルになりかねません。

例外発生時の後始末を含んでいない危険なプログラムの例 例外発生時の後始末を含んでいない危険なプログラムの例

 このプログラムでは、接続オブジェクトやステートメントオブジェクトを生成した後、例外が発生しない場合にのみ後始末をしています。よって、なんらかの例外が発生すると、後始末をせずに終了してしまいます。特に、SQL関連の例外では、catchされて正常終了しますので、後始末がされていないことに気が付かず危険です。

finallyを用いて万全のロジックを

 ですから、例外が発生しなくても、例外が発生してcatchしても、catchしなくても、必ず後始末は行うようなロジックにすべきです。finallyを用いて万全のロジックを組みましょう。

例外発生時の後始末を含む正しいプログラムの例 例外発生時の後始末を含む正しいプログラムの例

編集部注:上記サンプルコードの例外処理の中身については、本稿の趣旨とは離れるので、取りあえず、すべて一例として「System.out.println(e);」とさせて頂きました。ご了承ください。ソースコードを参考にされる際は、ご注意をお願いします。

訂正のお知らせ


読者から上記の図、「例外発生時の後始末を含む正しいプログラムの例」のサンプルコードについて貴重なご指摘を頂き、サンプルコードを差し替え、また編集部注を追記させて頂きました。

内容について正確を期せずに混乱を招いた点、読者の皆様におわび申し上げます。


Profile

RunDog.org

平野正喜


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。