具有多个数据源的MyBatis + Spring MapperScan

时间:2016-11-02 01:58:16

标签: spring mybatis spring-mybatis mappers

我使用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时遇到问题?

1 个答案:

答案 0 :(得分:0)

我在代码中看到的唯一问题是SELECT COUNT(*) AS comment_cnt, post_id FROM comment_table WHERE post_id IN (post_id1, post_id2, ...) GROUP BY post_id; 应该是小写的:(SqlSessionFactoryRef)。除了一切都很好,这种方法对我有用。

您还可以查看ace-mybatis。它允许使用仅配置一个bean的多个数据源。