프로젝트이 vault 기능이 필요하여, 부득이하게 Class 파일에서 DataSource 설정이 필요한 경우 아래와같이 작성한다
@Configuration
@EnableTransactionManagement
public class DataSourceConfig {
@Autowired
private ApplicationContext applicationContext;
@Value("#{new Integer('${db.connection.count}')}") // 설정 파일내 개수 적용(prod, dev 분할용)
private int dbConnectionSize;
@Bean(name = "dataSource")
public DataSource dataSource() throws Exception {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver"); // MySql인 경우
dataSource.setUrl("");
dataSource.setUsername("");
dataSource.setPassword("");
// Connection Count
dataSource.setInitialSize(dbConnectionSize);
dataSource.setMaxTotal(dbConnectionSize);
dataSource.setMaxIdle(dbConnectionSize);
dataSource.setMinIdle(dbConnectionSize);
dataSource.setMaxWaitMillis(10000);
// validation
dataSource.setValidationQuery("SELECT 1");
dataSource.setTestOnBorrow(false);
dataSource.setTestOnReturn(false);
// Connetion pool 검사 testWhileIdle 설정. 'TimeBetweenEvictionRunsMillis'마다 'NumTestsPerEvictionRun'개의 connection 꺼내 'ValidationQuery'를 날려 확인
dataSource.setTestWhileIdle(true); // Evictor 스레드가 실행될 때 (timeBetweenEvictionRunMillis > 0) 커넥션 풀 안에 있는 유휴 상태의 커넥션을 대상으로 테스트 실행
dataSource.setTimeBetweenEvictionRunsMillis(100000); // Evictor 가 동작하는 간격 (default = -1, 비활성화)
dataSource.setNumTestsPerEvictionRun(5); // Evictor 동작 시 한 번에 검사할 커넥션의 개수 (default = 3)
dataSource.setMinEvictableIdleTimeMillis(-1); // 사용하지 않는 커넥션 제거 (defatult - -1, 비활성화)
return dataSource;
}
@Bean(name="sqlSessionFactory")
public SqlSessionFactoryBean sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource());
sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:mybatis/mapper/**/*.xml"));
sqlSessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:/mybatis/mybatis-config.xml"));
return sqlSessionFactoryBean;
}
@Bean(name="dataSourceTransactionManager")
public DataSourceTransactionManager dataSourceTransactionManager(@Qualifier("dataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name="sqlSession")
public SqlSessionTemplate sqlSession(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
HikariCP 사용시 적용 방안(SpringBoot의 경우 HikariCP를 사용하자)
@Bean(name = "dataSource")
public DataSource dataSource() throws Exception {
HikariDataSource hikariDataSource = new HikariDataSource();
hikariDataSource.setDriverClassName(driverClassName);
hikariDataSource.setJdbcUrl(jdbcUrl);
hikariDataSource.setUsername(vault.getUsername());
hikariDataSource.setPassword(vault.getPassword());
// Connection Properties
hikariDataSource.setConnectionTimeout(30000); // default 30000
hikariDataSource.setMaximumPoolSize(10); // default 10
hikariDataSource.setMinimumIdle(10); // default maximumPoolSize, hikrariCP에서는 maximum-pool-size과 minimum-idle 값을 같은 값으로 지정하는것을 권장
// hikariDataSource.setIdleTimeout(600000); // pool에서 일을 안하는 커넥션을 유지하는 시간, default 600000, minimum-idle이 maximum-pool-size 보다 작을때만 설정
// hikariDataSource.setMaxLifetime(); // 커넥션 최대 수명 시간 default 1800000
return dataSource;
}
'SpringFramework > Spring' 카테고리의 다른 글
ModelMapper 사용 법 (0) | 2020.11.16 |
---|---|
Swagger2 설정 및 사용 (0) | 2020.11.13 |
REST API (0) | 2020.06.10 |
Spring Security 세션정보 조회 (0) | 2020.06.09 |
Spring Security 설정 (0) | 2020.06.09 |