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을 여러 데이터 소스와 함께 사용하는 데 문제가있는 사람이 있습니까?