MyBatis+Spring MapperScan с несколькими источниками данных

Я извлекаю данные из двух разных баз данных, используя 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, я получаю исключение "Таблица не найдена" из моей базы данных. Проблема в том, что, хотя я устанавливаю конкретную SqlSessionFactory, которую я хочу использовать в mapperScan, она в конечном итоге использует другую SqlSessionFactory для всех картографов. Если я закомментирую SqlSessionFactory в конфигурации 1, то конфигурация 2 будет работать.

Обратите внимание, что если я не использую MapperScan, но вместо этого использую bean-компонент MapperScannerConfigurer, я могу правильно получать данные.

У кого-нибудь еще были проблемы с использованием @MapperScan с несколькими источниками данных?

1 ответ

Единственная проблема, которую я вижу в вашем коде, это SqlSessionFactoryRef должно быть в нижнем регистре:(sqlSessionFactory). Кроме того, все хорошо, этот подход работает для меня.

Вы также можете посмотреть на туз mybatis. Это позволяет работать с несколькими источниками данных, настраивая только один компонент.

Другие вопросы по тегам