springboot多数据源配置和使用

时间:2022-07-23
本文章向大家介绍springboot多数据源配置和使用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

yml配置数据源

这个直接把多个数据库连接信息写上即可,用spring.datasource属性进行配置,如下:

spring:
  profiles: dev
  datasource:
    test1:
      jdbc-url: jdbc:mysql://10.204.58.202:3306/uniorder_sit1?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
      username: uniorder
      password: uniorder123.com
      type: com.alibaba.druid.pool.DruidDataSource
    test2:
      jdbc-url: jdbc:mysql://10.204.53.175:3306/ishare?allowMultiQueries=true
      username: pay
      password: pay123.com
      type: com.alibaba.druid.pool.DruidDataSource

注意spring boot 2.x之后要用 jdbc-url,不能用jdbc或者url。因为在2.x之后 spring boot把默认的JDBC连接池由 tomcat 换成了 HikariCP,后者只有jdbcUrl属性。

有兴趣的可以看看官方的说明,

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-configure-a-datasource

type 是指定Resource所属的Java类名。

config配置类

比如说有两个数据源,我们最好是组织两个配置类,这样结构清晰一些。

test1的配置类,

@Configuration
@MapperScan(basePackages = "com.example.dao.test1", sqlSessionTemplateRef = "db1SqlSessionTemplate")
public class Test1DBConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.test1")
    public DataSource db1DataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean
    public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/test1/**/*.xml"));
        return bean.getObject();
    }

    @Bean
    public DataSourceTransactionManager db1TransactionManager(@Qualifier("db1DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

解释一下,

@Configuration用于定义配置类,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法启动时被扫描来构建 bean 定义,初始化 spring 容器。相当于以前的 xml 配置 bean 的方式。

@MapperScan时 mybatis 的注解,用于告诉spring去扫描相关的package去发现相应的接口并利用mybatis对其做实现。这个注解可以加到配置类上,也可以加到spring boot 启动类上。这个package路径下放的就是mybatis生成的mapper接口类。

test2的配置类类似,这里不贴出来了。

mybatis接口和实现

mybatis的接口,实体定义,以及xml的sql实现,都可以用插件直接生成,这里就不详述了。

测试

我们可以写一个测试的controller来验证一下。

@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    Test1DAO test1DAO;
    @Autowired
    Test2DAO test2DAO;

    @GetMapping("/test1")
    public String test1(){
        User user = new User();
        test1DAO.insert(user);
    }

    @GetMapping("/test2")
    public String test2(){
        User user = new User();
        test2DAO.insert(user);
    }
}

多数据源下的事务问题

多数据源下使用事务时,需要在注解上明确是哪个数据源,类似下面这样,否则会报找不到事务管理实例的错误。

    @Transactional(value = "db1TransactionManager",rollbackFor = Exception.class)
    @Override
    public void run(Long startID, Long endID, boolean isCheck) {
        ...