geek的技术日志,记录每一次技术思考的闪光点。

Spring Cloud/Spring Boot Mybatis 多数据源配置

实际开发场景中,通常情况下单个微服务会配置多个数据源。这里主要介绍
项目使用多数据源 配置步骤。

一、数据源自动配置禁用

1、将spring boot自带的DataSourceAutoConfiguration禁掉,防止自动配置数据源。在@SpringBootApplication注解中添加exclude属性即可。 2、添加注解@EnableTransactionManagement 并创建两个事务管理器
@SpringBootApplication(exclude = {
        DataSourceAutoConfiguration.class
})
@EnableTransactionManagement
public class ManagerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ManagerApplication.class, args);
    }
    @Bean
    public PlatformTransactionManager testDBaTransactionManager(@Qualifier("testDBa") DataSource prodDataSource) {
        return new DataSourceTransactionManager(prodDataSource);
    }

    @Bean
    public PlatformTransactionManager testDBbTransactionManager(@Qualifier("testDBb") DataSource sitDataSource) {
        return new DataSourceTransactionManager(sitDataSource);
    }
}

二、serviceImpl层的@Transactional注解配置

在serviceImpl层的@Transactional注解中指定事务管理器。
  a、若service用到了两个操作不同数据源中mapper中的方法,则不指定事务管理器

  b、若service只用到了一个数据源的mapper,则需要指定事务管理器
@Service
@Transactional(value = "testDBaTransactionManager")
public class testaServiceImpl implements testaService {
    @Autowired
    private TestaMapper  testaMapper ;
}
@Service
@Transactional(value = "testDBbTransactionManager")
public class testbServiceImpl implements testbService {
    @Autowired
    private TestbMapper  testbMapper ;
}
@Service
@Transactional
public class testServiceImpl implements testService {
    @Autowired
    private TestaMapper  testaMapper ;
    @Autowired
    private TestbMapper  testbMapper ;
}

三、yml配置文件的修改

spring:
  datasource:
    testDBa:
      driver-class-name: com.mysql.jdbc.Driver
      type: com.alibaba.druid.pool.DruidDataSource
      url: jdbc:mysql://xx.xx.xx.xx:xxxx/db?useUnicode=true&characterEncoding=utf8&autoReconnect=true
      username: user
      password: pwd
    testDBb:
      driver-class-name: com.mysql.jdbc.Driver
      type: com.alibaba.druid.pool.DruidDataSource
      url: jdbc:mysql://**.**.**.**:****/db?useUnicode=true&characterEncoding=utf8&autoReconnect=true
      username: user
      password: pwd

四、创建新的mapper文件夹

将需要连接新DB的mapper文件放进来
1、将需要连接新DataSource的xml文件放进来 2、src层也创建新的对应文件夹存放mapper.java文件

五、数据源的配置

DataSourceConfig.java
@Configuration
public class DataSourceConfig {

    @Bean(name = "testDBa")
    // application.properteis中对应属性的前缀
    @ConfigurationProperties(prefix = "spring.datasource.testDBa")
    public DataSource dataSource1() {
        return DataSourceBuilder.create().build();
    }




    @Bean(name = "testDBb")
    // application.properteis中对应属性的前缀
    @ConfigurationProperties(prefix = "spring.datasource.testDBb")
    public DataSource dataSource2() {
        return DataSourceBuilder.create().build();
    }

}

六、Mybatis配置

接下来需要配置两个mybatis的SqlSessionFactory分别使用不同的数据源: MybatisDbAConfig.java
@Configuration
@MapperScan(basePackages = {"testa.mapper"}, sqlSessionFactoryRef = "sqlSessionFactory1")
public class MybatisDbAConfig {

    @Autowired
    @Qualifier("testDBa")
    private DataSource testDBa;


    @Bean
    public SqlSessionFactory sqlSessionFactory1() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        factoryBean.setConfiguration(configuration);
        // 使用testDBa数据源, 连接testDBa库
        factoryBean.setDataSource(testDBa);

        return factoryBean.getObject();

    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate1() throws Exception {
        // 使用注解中配置的Factory
        SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory1());
        return template;
    }
}
MybatisDbBConfig.java
@Configuration
@MapperScan(basePackages = {"testb.mapper"}, sqlSessionFactoryRef = "sqlSessionFactory2")
public class MybatisDbBConfig {

    @Autowired
    @Qualifier("testDBb")
    private DataSource testDBb;


    @Bean
    public SqlSessionFactory sqlSessionFactory1() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        factoryBean.setConfiguration(configuration);
        // 使用testDBb数据源, 连接testDBb库
        factoryBean.setDataSource(testDBb);

        return factoryBean.getObject();

    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate1() throws Exception {
        // 使用注解中配置的Factory
        SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory2());
        return template;
    }
}
最后,要配置好mapper文件的location, factoryBean.setMapperLocations(resolveMapperLocations(new String[]{“classpath:mappers/*.xml”})); 在yml或者在config或者在main注解里配置也可以。 打赏作者

未经允许不得转载:极客技术 » Spring Cloud/Spring Boot Mybatis 多数据源配置

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址