/* * Copyright (c) 2016. Lorem ipsum dolor sit amet, consectetur adipiscing elit. * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. * Vestibulum commodo. Ut rhoncus gravida arcu. */ package org.hibernate.examples.utils; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import lombok.extern.slf4j.Slf4j; import javax.sql.DataSource; import java.util.Map; import java.util.Properties; /** * {@link DataSource} 를 생성, 제공하는 Helper Object 입니다. * * @author 배성혁 sunghyouk.bae@gmail.com * @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 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 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<Object, Object> 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); } /** * 테스트에 사용하기 위해 메모리를 사용하는 HSql DB 에 대한 DataSource 를 반환합니다. */ public static DataSource getEmbeddedHSqlDataSource() { return getDataSource(HSQL_DRIVER_CLASS_NAME, "jdbc:hsqldb:mem:test;MVCC=TRUE;", "", ""); } /** * 테스트에 사용하기 위해 메모리를 사용하는 H2 DB 에 대한 DataSource 를 반환합니다. */ public static DataSource getEmbeddedH2DataSource() { return getDataSource(H2_DRIVER_CLASS_NAME, "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;MVCC=TRUE;", "", ""); } }