All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hibernate.examples.utils.DataSources Maven / Gradle / Ivy

The newest version!
package org.hibernate.examples.utils;

import com.jolbox.bonecp.BoneCPDataSource;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.slf4j.Slf4j;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
import java.util.Properties;

/**
 * {@link javax.sql.DataSource} 를 생성, 제공하는 Helper Object 입니다.
 *
 * @author 배성혁 [email protected]
 * @since 2013. 11. 28. 오전 11:04
 */
@Slf4j
public class DataSources {

    private DataSources() {}

    public static final String HSQL_DRIVER_CLASS_NAME = "org.hsql.jdbcDriver";
    public static final String H2_DRIVER_CLASS_NAME = "org.h2.Driver";

    /**
     * {@link javax.sql.DataSource} 를 빌드합니다. 기본적으로 Tomcat DataSource 를 사용합니다.
     *
     * @param driverClass DriverClass 명
     * @param url         Database 주소
     * @return [[javax.sql.DataSource]] 인스턴스
     */
    public static DataSource getDataSource(String driverClass, String url) {
        return getDataSource(driverClass, url, "", "");
    }

    /**
     * {@link javax.sql.DataSource} 를 빌드합니다. 기본적으로 Tomcat DataSource 를 사용합니다.
     *
     * @param driverClass DriverClass 명
     * @param url         Database 주소
     * @param username    사용자 명
     * @param passwd      사용자 패스워드
     * @return [[javax.sql.DataSource]] 인스턴스
     */
    public static DataSource getDataSource(String driverClass, String url, String username, String passwd) {
        return getHikariDataSource(driverClass, url, username, passwd, null);
        // return getBoneCPDataSource(driverClass, url, username, passwd);
        // return getTomcatDataSource(driverClass, url, username, passwd);
    }

    /**
     * HikariCP DataSource를 생성합니다.
     *
     * @param driverClass DriverClass 명
     * @param url         Database 주소
     * @param username    사용자 명
     * @param passwd      사용자 패스워드
     * @return [[javax.sql.DataSource]] 인스턴스
     */
    public static DataSource getHikariDataSource(String driverClass,
                                                 String url,
                                                 String username,
                                                 String passwd,
                                                 Properties props) {
        HikariConfig config = new HikariConfig();

        config.setDriverClassName(driverClass);
        config.setJdbcUrl(url);
        config.setUsername(username);
        config.setPassword(passwd);

        // MySQL 인 경우 성능을 위해 아래 설정을 사용합니다.
        if (DataConst.DRIVER_CLASS_MYSQL.equals(driverClass)) {
            config.addDataSourceProperty("cachePrepStmts", "true");
            config.addDataSourceProperty("prepStmtCacheSize", "250");
            config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
            config.addDataSourceProperty("useServerPrepStmts", "true");
        }

        if (props != null) {
            for (Map.Entry entry : props.entrySet())
                config.addDataSourceProperty(entry.getKey().toString(), entry.getValue().toString());
        }

        config.setMinimumIdle(2);
        config.setMaximumPoolSize(4 * Runtime.getRuntime().availableProcessors());

        config.setInitializationFailFast(true);
        config.setConnectionTestQuery("SELECT 1");

        return new HikariDataSource(config) {
            // multi-pool support was removed from Hikari
            @Override
            public Connection getConnection(String username, String password) throws SQLException {
                return getConnection();
            }
        };
    }

    /**
     * BoneCP DataSource 를 빌드합니다.
     *
     * @param driverClass DriverClass 명
     * @param url         Database 주소
     * @param username    사용자 명
     * @param passwd      사용자 패스워드
     * @return [[javax.sql.DataSource]] 인스턴스
     */
    public static DataSource getBoneCPDataSource(String driverClass, String url, String username, String passwd) {

        BoneCPDataSource ds = new BoneCPDataSource();
        ds.setDriverClass(driverClass);
        ds.setJdbcUrl(url);
        ds.setUser(username);
        ds.setPassword(passwd);

        int processCount = Runtime.getRuntime().availableProcessors();

        ds.setMaxConnectionsPerPartition(100);
        ds.setMinConnectionsPerPartition(processCount);
        ds.setPartitionCount(4);

        ds.setIdleMaxAgeInSeconds(120);
        ds.setIdleConnectionTestPeriodInSeconds(60);
        ds.setMaxConnectionAgeInSeconds(300);

        ds.setDisableJMX(true);

        return ds;
    }

    /**
     * 테스트에 사용하기 위해 메모리를 사용하는 HSql DB 에 대한 DataSource 를 반환합니다.
     */
    public static DataSource getEmbeddedHSqlDataSource() {
        return getDataSource(HSQL_DRIVER_CLASS_NAME, "jdbc:hsqldb:mem:test;MVCC=TRUE;", "sa", "");
    }


    /**
     * 테스트에 사용하기 위해 메모리를 사용하는 H2 DB 에 대한 DataSource 를 반환합니다.
     */
    public static DataSource getEmbeddedH2DataSource() {
        return getDataSource(H2_DRIVER_CLASS_NAME, "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;MVCC=TRUE;", "sa", "");
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy