[Java] ユニットテストでコネクションプールを使う

2017年12月18日月曜日

Java JDBC MySQL Tomcat

コネクションプール

[Java]ユニットテストでDataSourceを使うでは、自前のContextを作ってDataSourceを取得した。
通常のユニットテストであれば、これでも十分だけど、パフォーマンステストなんかでテスト対象がマルチスレッドになっている場合はコネクションプールが欲しくなる。

もちろん、アプリケーションサーバであれば、サーバ側がコネクションプールを用意してくれているので、それを使う。
サーバを介さないでコネクションプールを使う方法があるので、それをやってみよう。

Tomcat JDBC Connection Pool

Tomcat 7のJDBC Connection Poolをアプリケーションから単独で使ってみよう。
https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

と言っても、それほど難しいことはなく、[Java]ユニットテストでDataSourceを使うの初期化処理を少し変えるくらい。

まずは以下の2つのjarファイルを参照するようにしておこう。
これらはTomcatのインストールパスに存在する。

bin/tomcat-juli.jar
lib/tomcat-jdbc.jar

初期化処理

これらを参照するようにしたら、初期化処理を以下のようにする。

DataSourceクラスは javax.sql.DataSource ではなく、org.apache.tomcat.jdbc.pool.DataSource なので、注意しよう。
import org.apache.tomcat.jdbc.pool.PoolProperties;
import org.apache.tomcat.jdbc.pool.DataSource;


    static void init() throws NamingException {
        System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "local.MyContextFactory");
        System.setProperty(Context.URL_PKG_PREFIXES, "local");

        PoolProperties props = new PoolProperties();
        props.setUrl("jdbc:mysql://localhost:3306/testdb?useSSL=false");
        props.setDriverClassName("com.mysql.jdbc.Driver");
        props.setUsername("testdb");
        props.setPassword("testdb");
        props.setMaxActive(100);
        props.setInitialSize(10);

        DataSource ds = new DataSource();
        ds.setPoolProperties(props);
        Context ctx = new InitialContext();
        ctx.bind("jdbc/test", ds);
    }

前回と異なる点は各設定をPoolPropertiesに設定して、DataSourceにPoolPropertiesを渡すところ。
設定できる値はこれ以外にもたくさんあるけど、最低限の設定はこれでいいだろう。

https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/tomcat/jdbc/pool/PoolProperties.html

これで、DataSource使用側はコネクションプールからコネクションを取得できるようになる。