多数据源

使用 Spring Boot 时,默认情况下,配置 DataSource 非常容易。Spring Boot会自动为我们配置好一个 DataSource。

如果在 application.yml 中指定了 spring.datasource 的相关配置,Spring Boot 就会使用该配置创建一个DataSource。如果在 application.yml 中没有指定任何 spring.datasource 的相关配置,Spring Boot 会在 classpath 中搜索 H2、hsqldb 等内存数据库的jar包,如果找到了,就会自动配置一个内存数据库的 DataSource,所以,我们只要引入jar包即可。例如,配置一个 hsqldb 数据源:

<dependency>
    <groupId>org.hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <scope>runtime</scope>
</dependency>

但是,在某些情况下,如果我们需要配置多个数据源,应该如何在 Spring Boot 中配置呢?

  • application.yml 配置

    spring:
      application:
        name: data-multidatasource
      db1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/spring-boot-jpa
        username: root
        password: root
      db2:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/spring-boot-jpa
        username: root
        password: root
    
  • 分别定义指定的数据源配置,不同类型数据库的配置初始化不一致,下面是 mybatis-plus 的 mysql 工厂注册。这样所有这个 com.mapper.db1 包下面的都会使用这个数据源。

    //表示这个类为一个配置类
    @Configuration
    // 配置mybatis的接口类放的地方
    @MapperScan(basePackages = "com.mapper.db1", sqlSessionFactoryRef = "test1SqlSessionFactory")
    public class DataSourceConfig {
        @Bean(name = "test1DataSource")
        // 表示这个数据源是默认数据源
        @Primary
        // 读取application.properties中的配置参数映射成为一个对象, prefix表示参数的前缀
        @ConfigurationProperties(prefix = "spring.datasource.db1")
        public DataSource getDateSource1() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean(name = "test1SqlSessionFactory")
        // 表示这个数据源是默认数据源
        @Primary
        // @Qualifier表示查找Spring容器中名字为test1DataSource的对象
        public SqlSessionFactory test1SqlSessionFactory(@Qualifier("test1DataSource") DataSource datasource) throws Exception {
            //使用mybatisplus不能使用原生SqlSessionFactoryBean,否则会抛出Invalid bound statement (not found)
            MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
            sqlSessionFactory.setDataSource(getDateSource1());
            sqlSessionFactory.setPlugins(new Interceptor[]{new PaginationInterceptor()});
            sqlSessionFactory.setMapperLocations( new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/test01/*.xml"));
    
            MybatisConfiguration configuration = new MybatisConfiguration();
            configuration.setJdbcTypeForNull(JdbcType.NULL);
            configuration.setMapUnderscoreToCamelCase(true);
            configuration.setLogImpl(org.apache.ibatis.logging.stdout.StdOutImpl.class);
            configuration.setCacheEnabled(false);
            sqlSessionFactory.setConfiguration(configuration);
            return sqlSessionFactory.getObject();
        }
    
        @Bean("test1SqlSessionTemplate")
        // 表示这个数据源是默认数据源
        @Primary
        public SqlSessionTemplate test1sqlsessiontemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sessionfactory) {
            return new SqlSessionTemplate(sessionfactory);
        }
    }
    

    动态数据源

    // todo

上次更新时间: 2024/5/7 05:59:02