스프링 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/

반응형

+ Recent posts