2011年6月26日日曜日

ucpを使用したDB接続のプール

JDK5以降(ojdbc5.jarやojdbc6.jar)を使用してOracleとの接続をキャッシュしたい場合、
jdbcドライバのjar意外にucp.jarなるものが必要となる。

ucpとは、ユニバーサルコネクションプールの略で、汎用的なプール機構を提供してくれる。
汎用的な機構なので、別にOracle専用というわけではなくMySqlやDB2などの接続をプールすることができる。
Webコンテナが提供してくれている接続のプーリング機構を、スタンドアロンアプリからも利用出来るようにしてくれてるイメージかな。

マニュアルはこちら→http://download.oracle.com/docs/cd/E16338_01/java.112/b56283/toc.htm
ucpは、http://www.oracle.com/technetwork/jp/database/enterprise-edition/ucp-096353-ja.htmlからダウンロード出来る。

※ojdbc5.jar以降のjdbcドライバには、ojdbc4.jarで使用していた接続プール機能はすべて非推奨となっている。
しかも、その動作すら無効かされているため、プールを有効化しても完全に無視される。

サンプルコード

ucpを使用した接続キャッシュはこんな感じのコードで実装できる。
PoolDataSourceには、ステートメントキャッシュ用のプロパティなどもあるが、そのへんはマニュアルを見て適宜設定すればよいかなと。
        // プールデータソースを生成
        PoolDataSource dataSource = PoolDataSourceFactory.getPoolDataSource();

        // コネクションファクトリクラス名を完全修飾名で設定する。
        // Oracleの場合は、「oracle.jdbc.pool.OracleDataSource」を設定すれば良い
        dataSource.setConnectionFactoryClassName(
                "oracle.jdbc.pool.OracleDataSource");

        // DB接続情報(URL、ユーザ名、パスワード)を設定する。
        dataSource.setURL("jdbc:oracle:thin:@localhost:1521:xe");
        dataSource.setUser("hoge");
        dataSource.setPassword("hoge");
        // プール情報を設定する。
        dataSource.setInitialPoolSize(5);
        dataSource.setMaxPoolSize(5);

        // 接続を取得する。
        // このタイミングで、PoolDataSourceによって接続がプールされる。
        Connection connection = dataSource.getConnection();

サンプルコード2

接続先のデータベースがmysqlの場合の接続例。
ConnectionFactoryClassNameをmysqlのデータソースに変えてあげて、接続設定をmysqlように変更する。
        // プールデータソースを生成
        PoolDataSource dataSource = PoolDataSourceFactory.getPoolDataSource();

        // コネクションファクトリクラス名を完全修飾名で設定する。
        // 「com.mysql.jdbc.jdbc2.optional.MysqlDataSource」を設定すれば良い
        dataSource.setConnectionFactoryClassName(
                "com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
        // DB接続情報(URL、ユーザ名、パスワード)を設定する。
        dataSource.setURL("jdbc:mysql://localhost/test");
        dataSource.setUser("hoge");
        dataSource.setPassword("hoge");
        // プール情報を設定する。
        dataSource.setInitialPoolSize(5);
        dataSource.setMaxPoolSize(5);

        // 接続を取得する。
        // このタイミングで、PoolDataSourceによって接続がプールされる。
        Connection connection = dataSource.getConnection();