스프링 boot 버전이 올라 가면서 application.yml 로만 으로도 설정이 가능해 졌다고 합니다.
버전 높으시면 application.yml 찾아봐 주세요..
-----------------------------------------------------------------------------------------------
Spring Boot 를 이용해서 mysql+mybatis를 이용하여 application.yml 에 mysql 접속 정보 및
mybatis 설정을 하여 자동으로 SqlSession 을 사용해 사용 했습니다.
이런 DB 두곳 접속 이슈가 발생 했습니다.
제가 못 찾은 건지 모르겠지만. 자동으로 멀티 데이터소스는 안되는 듯 해서 검색해서 열심히 찾아 작업을 해 보았습니다.
1. application.yml 에 db 접속정보 2개로 변경
1
2
3
4
5
6
7
8
9
10
11
12
13
|
spring:
datasource1:
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
jdbc-url: jdbc:log4jdbc:mysql:nananananan
username: username
password: password
jmx-enabled: false
datasource2:
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
jdbc-url: jdbc:log4jdbc:mysql:nananananan
username: username
password: password
jmx-enabled: false
|
cs |
2. 우선 DataSourceConfig.java 파일을 만들어 DB 연결을 수동으로 처리 합니다.
- Bean생성 할때 같은 종류의 Bean을 여러개 생성하면 오류 발생
- 처음 생성하는 Bean에 @Primary를 설정해야 복수게 생성 가능
스프링부트는 기본적으로 DataSource 를 하나로 처리 하기 때문에
@Primary 설정을 해줘야 멀티로 잘 인식
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
@Configuration
@MapperScan(basePackages = {"com.pppp.tool"})
public class DataSourceConfig {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
/** DataSource Main 생성 */
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource1")
public DataSource mysql1DataSource() {
return DataSourceBuilder.create()
.type(HikariDataSource.class)
.build();
}
/** DataSource Sub 생성 */
@Bean
@ConfigurationProperties(prefix = "spring.datasource2")
public DataSource mysql2DataSource() {
return DataSourceBuilder.create()
.type(HikariDataSource.class)
.build();
}
/** sqlSessionFactory Main 생성 */
@Bean
@Primary
public SqlSessionFactory sqlSessionFactoryMain(@Autowired @Qualifier("mysql1DataSource") DataSource dataSource) throws Exception {
logger.info("SqlSessionFactory Main Start");
org.apache.ibatis.session.Configuration configuration = this.getMybatisConfig();
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setVfs(SpringBootVFS.class);
factoryBean.setConfiguration(configuration);
factoryBean.setTypeHandlersPackage("com.commax.tool.framework.mybatis.typehandler");
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resource = resolver.getResources("mybatis/**/*.xml");
factoryBean.setMapperLocations(resource);
return factoryBean.getObject();
}
/** sqlSessionFactory Sub 생성 */
@Bean
public SqlSessionFactory sqlSessionFactory(@Autowired @Qualifier("mysql2DataSource") DataSource dataSource) throws Exception {
logger.info("SqlSessionFactory SUB Start");
org.apache.ibatis.session.Configuration configuration = this.getMybatisConfig();
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setVfs(SpringBootVFS.class);
factoryBean.setConfiguration(configuration);
factoryBean.setTypeHandlersPackage("com.commax.tool.framework.mybatis.typehandler");
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resource = resolver.getResources("mybatis/**/*.xml");
factoryBean.setMapperLocations(resource);
return factoryBean.getObject();
}
/** sqlSession Main 생성 */
@Bean
@Primary
public SqlSession sqlSessionMain(@Autowired @Qualifier("sqlSessionFactoryMain") SqlSessionFactory factory) {
return new SqlSessionTemplate(factory);
}
/** sqlSession Sub 생성 */
@Bean
public SqlSession sqlSessionSub(@Autowired @Qualifier("sqlSessionFactory") SqlSessionFactory factory) {
return new SqlSessionTemplate(factory);
}
/** MybatisConfig 설정정보 */
private org.apache.ibatis.session.Configuration getMybatisConfig() {
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setCacheEnabled(true);
configuration.setLazyLoadingEnabled(false);
configuration.setAggressiveLazyLoading(false);
configuration.setMultipleResultSetsEnabled(true);
configuration.setUseColumnLabel(true);
configuration.setAutoMappingBehavior(AutoMappingBehavior.PARTIAL);
configuration.setDefaultExecutorType(ExecutorType.SIMPLE);
configuration.setDefaultStatementTimeout(25000);
configuration.setMapUnderscoreToCamelCase(true);
configuration.setJdbcTypeForNull(JdbcType.NVARCHAR);
configuration.setLazyLoadTriggerMethods(new HashSet<>(Arrays.asList("equals", "clone", "hashCode", "toString")));
configuration.setLogPrefix("[SQL]");
return configuration;
}
}
|
cs |
3. 이제 그냥 사용 하시면 됩니다.
1
2
3
4
5
6
7
|
/** 메인DB 연결 */
@Autowired @Qualifier("sqlSessionMain")
protected SqlSession sqlSession;
/** 서브DB 연결 */
@Autowired @Qualifier("sqlSessionSub")
protected SqlSession sqlSessionSub;
|
cs |
* multi datasource 참고 블로그
https://jodu.tistory.com/12
https://jojoldu.tistory.com/296
http://devgou.com/article/Spring-MyBatis/
'개발 > Java, Spring' 카테고리의 다른 글
[JPA] Spring JPA CascadeType 종류 (0) | 2023.08.25 |
---|---|
AOP로 컨트롤러 권한체크하기 (0) | 2023.01.16 |
Spring Security SameSite 설정 (0) | 2022.12.19 |
STS(이클립스) 공백이 자동 제거되어 git 충돌나는 경우 (1) | 2022.10.04 |
이클립스(STS) 프로젝트 익스플로러 폰트 변경 (0) | 2021.11.09 |