2016-11-02 4 views
0

MyBatis 3.3.1 및 Spring 4.3을 사용하여 두 개의 다른 데이터베이스에서 데이터를 가져옵니다.다중 데이터 소스가있는 MyBatis + Spring MapperScan

@Configuration 
    @MapperScan(value="com.mapper1.map", 
    SqlSessionFactoryRef="sqlSessionFactory1") 
    public class AppConfig { 
    @Bean 
    public DataSource getDataSource1() { 
     BasicDataSource dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
     dataSource.setUrl("jdbc:mysql://localhost:3306/database1"); 
     dataSource.setUsername("user"); 
     dataSource.setPassword("pw"); 
     return dataSource; 
    } 
    @Bean 
    public DataSourceTransactionManager transactionManager1() { 
     return new DataSourceTransactionManager(getDataSource1()); 
    } 
    @Bean 
    public SqlSessionFactory sqlSessionFactory1() throws Exception { 
     SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); 
     sessionFactory.setDataSource(getDataSource1()); 
     return sessionFactory.getObject(); 
    } 
} 

    @Configuration 
    @MapperScan(value="com.mapper2.map", 
    SqlSessionFactoryRef="sqlSessionFactory2") 
    public class AppConfig { 
    @Bean 
    public DataSource getDataSource2() { 
     BasicDataSource dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
     dataSource.setUrl("jdbc:mysql://localhost:3307/database2"); 
     dataSource.setUsername("user"); 
     dataSource.setPassword("pw"); 
     return dataSource; 
    } 
    @Bean 
    public DataSourceTransactionManager transactionManager2() { 
     return new DataSourceTransactionManager(getDataSource2()); 
    } 
    @Bean 
    public SqlSessionFactory sqlSessionFactory2() throws Exception { 
     SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); 
     sessionFactory.setDataSource(getDataSource2()); 
     return sessionFactory.getObject(); 
    } 
} 

코드는 잘 배치하지만, 데이터 소스 1 개 작품 만 매퍼 : 두 개의 구성 클래스는 맵퍼 모양을 위해 다음에 스캔합니다. 데이터 소스 2에서 매퍼를 사용하려고하면 데이터베이스에서 "테이블을 찾을 수 없습니다"예외가 발생합니다. 문제는 mapperScan에서 사용하려는 특정 SqlSessionFactory를 설정하더라도 모든 Mappers에 대해 다른 SqlSessionFactory를 사용하여 종료된다는 것입니다. 구성 1에서 SqlSessionFactory를 주석 처리하면 구성 2가 작동합니다.

MapperScan을 사용하지 않고 대신 MapperScannerConfigurer 빈을 사용할 경우 데이터를 올바르게 검색 할 수 있습니다.

@MapperScan을 여러 데이터 소스와 함께 사용하는 데 문제가있는 사람이 있습니까?

답변

0

코드에 나타나는 유일한 문제는 SqlSessionFactoryRef입니다 (소문자 : sqlSessionFactory). 그 모든 것들이 괜찮은 것 외에도,이 접근법은 나를 위해 작동합니다.

ace-mybatis을 볼 수도 있습니다. 하나의 빈만을 구성하는 여러 데이터 소스로 작업 할 수 있습니다.