フレームワークを使って Web アプリケーションを再構築しよう(その 2)

Commons DBCP の利用

Web アプリケーションで DataSource を取得する際、context.xml への記述ではなくて Commons DBCP を利用する方法もあります。実務上は context.xml を使うのが一般的らしいですが、こういうやり方もあるということを知っておくと何かと便利かと思います。Commons DBCP を利用する際には同時に Commons Pool が必要になるので Apache Commons のサイトから両方をダウンロードしてください。しかる後に WEB-INF/lib フォルダに

  • commons-dbcp-1.4.jar
  • commons-pool-1.6.jar

をコピーします。

SettingUtil.java の作成

package jp.mydns.akanekodou.util;

import java.util.Properties;
import java.io.InputStream;
import java.io.IOException;

public class SettingUtil {
    private static SettingUtil inst = new SettingUtil();
    private static final String PREFNAME = "jdbc.properties";
    private Properties prop;

    private SettingUtil() {
        prop = new Properties();
        InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(PREFNAME);
        try {
            prop.load(in);
        } catch(IOException ie) {
            ie.printStackTrace();
        }
    }

    public static String getProperty(String key) {
        return inst.prop.getProperty(key);
    }
}

後で作る jdbc.properties ファイルから設定を読み込むための SettingUtil クラスを作成します。シングルトンとして実装しています。

jdbc.properties の作成

jdbc.driver.classname = com.mysql.jdbc.Driver
jdbc.driver.url = jdbc:mysql://localhost:3306/menudb
jdbc.driver.user = scott
jdbc.driver.pass = tiger

context.xml に記述していた設定を jdbc.properties ファイルに記述します。ファイルは Java Resources の src フォルダ直下に置いてください。

DaoUtil.java の修正

package jp.mydns.akanekodou.dao;

import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;

import jp.mydns.akanekodou.util.SettingUtil;

public class DaoUtil {
    private DataSource source;
    private static DaoUtil inst = new DaoUtil();

    private static final String JDBC_DRIVER = "jdbc.driver.classname";
    private static final String JDBC_URL = "jdbc.driver.url";
    private static final String JDBC_USER = "jdbc.driver.user";
    private static final String JDBC_PASS = "jdbc.driver.pass";

    private DaoUtil() {
        source = createDataSource();
    }

    public static DataSource getSource() {
        return inst.source;
    }

    private DataSource createDataSource() {
        BasicDataSource bds = new BasicDataSource();
        bds.setDriverClassName(SettingUtil.getProperty(JDBC_DRIVER));
        bds.setUrl(SettingUtil.getProperty(JDBC_URL));
        bds.setUsername(SettingUtil.getProperty(JDBC_USER));
        bds.setPassword(SettingUtil.getProperty(JDBC_PASS));
        return bds;
    }
}

createDataSource の部分が大幅に変わっています。ここで Commons DBCP に用意されている BasicDataSource を利用して、さらに先ほど作った SettingUtil で jdbc.properties からパラメータを取得しています。

以上の作業が終わったら、context.xml は削除して構いません。web.xml の修正は必要ありません。このままで以前と同様に動きます。

Tomcat にも DBCP はある

Commons DBCP 1.4 は表向きは「JDK 1.6 only」となっていますが、今回 Java 7(JDK 1.7) で試したところ問題なく動きました。ちなみに DBCP は最新の Tomcat では標準で実装されていて、それを使うこともできるのですが、「Java は Write Once, Run Anywhere」という精神からすると、Tomcat という環境に依存した書き方は推奨できませんので Commons DBCP の方を使うことをお勧めします。いずれにせよ余計なライブラリを持ってこなければならなかったりするので面倒は面倒ですし、それゆえに実務ではあまり使われない方法なのだと思います。