環境依存のパラメータはプロパティとして設定できるようにします。たとえば JDBC の JNDI 名 は典型的に環境に依存するので外部から与えられるようにするのが一般的です。
プロパティを使用するといっても Properties クラスではプロパティファイルを絶対パスで指定 する必要があり環境依存をソースファイルに取り込んでしまいますが書き込みもできます。 一方、ResourseBundle クラスではクラスパスを探してくれますが、読み込みのみとなります。 本来 ResourceBundle はその名のとおり各国語対応を行うときにメッセージを取り扱うクラス なのですが、ここでは Properties クラスよりもかなり便利なので ResoureBundle クラスを 使用しています。なお、コンストラクタへの引数に .properties をつけないことに注意しま しょう。
サンプルソース
// プロパティファイル
private final String PROPERTYBASE = "training"; // training.properties
// データソース
private DataSource ds = null;
private String datasourcename = null;
/**
* DataSource を設定します。
*
* @throws Exception JNDI lookup が失敗した場合
*/
protected void setDataSource() throws Exception {
InitialContext ic = null;
try {
// プロパティファイルからキーと値のリストを読み込みます
ResourceBundle bundle = ResourceBundle.getBundle(PROPERTYBASE);
try {
datasourcename = bundle.getString("dbs.datasource");
} catch (MissingResourceException e) {
log.error("dbs.datasource resource entry is missing.");
throw e;
}
//log.info("datasourcename=" + datasourcename);
// 初期コンテキストを取得
ic = new InitialContext();
// ルックアップしてデータソースを取得
ds = (DataSource)ic.lookup(datasourcename);
} catch (Exception e) {
log.error(e.getMessage());
throw e;
} finally {
try {
if(ic != null)
ic.close();
} catch (Exception e) {
log.error(e.getMessage());
// エラー発生
throw e;
}
}
}
training.properties、これを WEB-INF/classes に配置します。
# DataSource dbs.datasource=java:comp/env/jdbc/MSSQLDS