MyBatisSpring Mapper 多数据源扫描
MyBatis+Spring MapperScan with Mulitple Data Sources
我正在使用 MyBatis 3.3.1 和 Spring 4.3 从两个不同的数据库中提取数据。扫描映射器的两个配置类如下:
@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 中的映射器时,我从数据库中收到 "No table found" 异常。问题是,虽然我正在设置我想在 mapperScan 中使用的特定 SqlSessionFactory,但它最终会为所有映射器使用其他 SqlSessionFactory。如果我在配置 1 中注释掉 SqlSessionFactory,那么配置 2 将起作用。
请注意,如果我不使用 MapperScan,而是使用 MapperScannerConfigurer bean,我能够正确检索数据。
有没有其他人在将@MapperScan 与多个数据源一起使用时遇到问题?
我在您的代码中看到的唯一问题是 SqlSessionFactoryRef
应该来自小写字母:(sqlSessionFactory
)。除此之外一切都很好,这种方法对我有用。
你也可以看看ace-mybatis。它允许使用多个数据源,只配置一个 bean。
我正在使用 MyBatis 3.3.1 和 Spring 4.3 从两个不同的数据库中提取数据。扫描映射器的两个配置类如下:
@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 中的映射器时,我从数据库中收到 "No table found" 异常。问题是,虽然我正在设置我想在 mapperScan 中使用的特定 SqlSessionFactory,但它最终会为所有映射器使用其他 SqlSessionFactory。如果我在配置 1 中注释掉 SqlSessionFactory,那么配置 2 将起作用。
请注意,如果我不使用 MapperScan,而是使用 MapperScannerConfigurer bean,我能够正确检索数据。
有没有其他人在将@MapperScan 与多个数据源一起使用时遇到问题?
我在您的代码中看到的唯一问题是 SqlSessionFactoryRef
应该来自小写字母:(sqlSessionFactory
)。除此之外一切都很好,这种方法对我有用。
你也可以看看ace-mybatis。它允许使用多个数据源,只配置一个 bean。