読者です 読者をやめる 読者になる 読者になる

Javaと情熱のあいだ

Play Frameworkはじめました

コネクションプールのサンプル

材料は、Apache Commonsから調達
commons-dbcp
commons-pool

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbcp.ConnectionFactory;
import org.apache.commons.dbcp.DriverManagerConnectionFactory;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.PoolingDataSource;
import org.apache.commons.pool.impl.GenericObjectPool;

/**
 * <HR>
 * <P>
 *  ■モジュール名 <BR>
 * <BLOCKQUOTE>
 *      PoolAppender.java <BR>
 * </BLOCKQUOTE>
 * <P>
 *  ■クラス仕様 <BR>
 * <BLOCKQUOTE>
 *      PoolAppenderクラスはデータソースプールを作成するクラスです。<BR>
 * </BLOCKQUOTE>
 * <P>
 * <HR>
 * <P>
 */
public class PoolAppender {

    /**
     *
     * データソースプールを取得する
     * @return
     */
    public static PoolingDataSource getDataSource()
    {
        try {
            Class.forName("JDBCドライバ");

            GenericObjectPool pool = new GenericObjectPool();

            ConnectionFactory conFactory
            = new DriverManagerConnectionFactory(
                    "DB接続先URL"
                    , "ユーザ"
                    , "パスワード");

            //PoolableConnectionFactoryで読み込みのみ、オートコミットとか指定する。
            new PoolableConnectionFactory(
                    conFactory, pool, null, null, false, true);

            return new PoolingDataSource(pool);

        } catch (Throwable t) {
            throw new RuntimeException(t);
        }
    }

    /**
     *
     * プールにコネクションを戻す
     * @param con
     */
    public static void closeConnection(Connection conn) {
        try {
            if ( conn != null && !conn.isClosed() ) {
                conn.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     *
     * ロールバック
     * @param conn
     */
    public static void rollbackConnection(Connection conn) {
        try {
            if ( conn != null && !conn.isClosed() ) {
                conn.rollback();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

作った疑問点として、new PoolingDataSourceで作ったPoolingDataSource
は、closeが無いけどプールの開放は勝手にやってくれるんだろうか?
それとも別の、方法があるのかな?