MyBatis 3.3.1 と Spring 4.3 を使用して、2 つの異なるデータベースからデータを取得しています。マッパーをスキャンする 2 つの構成クラスは次のようになります。
@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 を設定しているにもかかわらず、すべてのマッパーに対して他の SqlSessionFactory を使用してしまうことです。構成 1 の SqlSessionFactory をコメント アウトすると、構成 2 が機能します。
MapperScan を使用せず、代わりに MapperScannerConfigurer Bean を使用すると、データを正しく取得できることに注意してください。
@MapperScan を複数のデータ ソースで使用する際に問題が発生した人はいますか?