在使用springboot开发业务应用程序的过程中,使用多数据源的场景很常见。目前,业界常用的spring boot整合多数据源的方案主要有两个,一个是Mapper分包方式,另一个是AOP切片方式。针对这种多数据源使用场景的痛点,MyBatis-plus团队开源了一个更为方便的解决方案(https://mp.baomidou.com/guide/dynamic-datasource.html),但是对于整合druid数据库连接池,却没有给出具体的使用示例。本篇文章就是使用springboot整合mybatis-plus、druid连接池和多数据源配置,给出一个可用的示例。

一、在SpringBoot项目pom文件中引入依赖

在SpringBoot项目pom文件中,引入如下依赖:

<!-- 常用collection操作 依赖 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.1</version>
        </dependency>

        <!-- mybatis-plus依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>

        <!-- druid连接池依赖 -->
        <!-- 如果使用druid-spring-boot-starter, 那么需要在启动类上使用@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) -->
        <!--        <dependency>-->
        <!--            <groupId>com.alibaba</groupId>-->
        <!--            <artifactId>druid-spring-boot-starter</artifactId>-->
        <!--            <version>1.2.4</version>-->
        <!--        </dependency>-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.4</version>
        </dependency>

        <!--多数据源依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.3.1</version>
        </dependency>

        <!-- mysql connector 依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.23</version>
            <scope>runtime</scope>
        </dependency>

        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- 测试类 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

 

二、application属性文件增加数据源配置项

使用property格式配置,则属性配置文件application.properties内容为:



mybatis-plus.mapper-locations=classpath:mapper/*.xml
mybatis-plus.type-aliases-package=com.mvp.world.mybatisplusdynamicdruid.model.po

########################## 多数据源配置###############################
## druid连接池配置
# 默认数据源
spring.datasource.dynamic.primary=master
# 主库配置 master
spring.datasource.dynamic.datasource.master.username=test_user
spring.datasource.dynamic.datasource.master.password=test_pswd
spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:3306/mysql-plus?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
spring.datasource.dynamic.datasource.master.druid.initial-size=5
spring.datasource.dynamic.datasource.master.druid.max-active=20
spring.datasource.dynamic.datasource.master.druid.min-idle=5
spring.datasource.dynamic.datasource.master.druid.max-wait=60000
spring.datasource.dynamic.datasource.master.druid.min-evictable-idle-time-millis=300000
spring.datasource.dynamic.datasource.master.druid.max-evictable-idle-time-millis=300000
spring.datasource.dynamic.datasource.master.druid.time-between-eviction-runs-millis=60000
# 从库配置 slave
spring.datasource.dynamic.datasource.slave.username=test_user
spring.datasource.dynamic.datasource.slave.password=test_pswd
spring.datasource.dynamic.datasource.slave.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.dynamic.datasource.slave.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.dynamic.datasource.slave.url=jdbc:mysql://localhost:3306/mysql-plus-slave?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
spring.datasource.dynamic.datasource.slave.druid.initial-size=5
spring.datasource.dynamic.datasource.slave.druid.max-active=20
spring.datasource.dynamic.datasource.slave.druid.min-idle=5
spring.datasource.dynamic.datasource.slave.druid.max-wait=60000
spring.datasource.dynamic.datasource.slave.druid.min-evictable-idle-time-millis=300000
spring.datasource.dynamic.datasource.slave.druid.max-evictable-idle-time-millis=300000
spring.datasource.dynamic.datasource.slave.druid.time-between-eviction-runs-millis=60000
## 去除druid配置
#spring.autoconfigure.exclude=com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure 
############################# 多数据源配置##############################

说明:

1.spring.datasource.dynamic.primary=master 表示设置master数据源为primary数据源。

2.在application.properties属性文件中,配置的多个数据源以spring.datasource.dynamic.datasource为前缀。

3.spring.datasource.dynamic.strict=false 设置严格模式,默认false不启动.。若设置为true,则在未匹配到指定数据源时会抛出异常。若设置为false,则在未匹配到指定数据源时会使用默认数据源。

如果使用yaml格式配置,则application.yaml配置文件内容为:

server:
  port: 8080
spring:
  datasource:
    dynamic:
      primary: master # 配置默认数据库
      datasource:
        master: # 数据源1配置
          url: jdbc:mysql://localhost:3306/db1?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8
          username: test_user
          password: test_pswd
          driver-class-name: com.mysql.cj.jdbc.Driver
        slave: # 数据源2配置
          url: jdbc:mysql://localhost:3306/db2?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8
          username: test_user
          password: test_pswd
          driver-class-name: com.mysql.cj.jdbc.Driver
      durid:
        initial-size: 1
        max-active: 20
        min-idle: 1
        max-wait: 60000
  autoconfigure:
    # 去除druid配置。是否需要,根据druid连接池的类型。如果druid连接池为starter类型,则需要排除。否则,不需要。
    exclude:  com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure 

三、@DS 注解

@DS注解可用于方法或类上。若同时存在,则方法上的注解优先于类上的注解。
官网推荐@DS注解在service层使用,且是实现类上使用,在接口层无效。注解用在service实现或mapper接口方法上,不要同时在service和mapper注解。

注解结果
没有@DS默认数据源
@DS(“dsName”)dsName可以为组名也可以为具体某个库名

若没有使用@DS注解,则会使用默认数据源。
@DS(“dsName”) dsName可以为某个具体库名,也可以为组名。若dsName为组名,则会使用负载均衡算法进行切换。

四、启动排除druid连接池默认自动配置

1. 如果在pom文件中引入druid连接池的依赖为druid-spring-boot-starter,那么需要在应用启动时排除druid默认加载的db配置项。原因为:DruidDataSourceAutoConfigure会注入一个DataSourceWrapper,这个数据源包装器会在原生spring.datasource或spring.datasource.druid路径下查找url、username、password等属性。动态数据源依赖默认加载的 url、username、password等配置项是在spring.datasource.dynamic路径下,因此需要排除druid属性默认加载,否则程序会报错。排除druid属性默认加载的方式有两种,一种是在配置文件中排除,另一种是在项目启动类中排除。

在配置文件中排除druid属性默认加载,其方法为在配置文件中添加如下内容:

spring.autoconfigure.exclude=com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure 

在项目启动类中排除druid属性默认加载,其方法为在@SpringBootApplication注解中排除DruidDataSourceAutoConfigure.class,如下所示:

@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)

2. 如果在pom文件中引入druid连接池的依赖非starter版本的druid依赖,那么应用程序在启动时不会加载druid默认的db配置项,也就不用考虑如何排除DataSourceWrapper数据源包装器。建议使用这种方式。

五、使用多数据源代码示例

1.在mapper层使用mybatis-plus整合多数据源

@DS("slave") 
public interface UserMapper extends BaseMapper<User> {
}

2.在service层使用JdbcTemplate整合多数据源

@Service
public class UserServiceImpl implements UserService {
 
  @Autowired
  private JdbcTemplate jdbcTemplate;
 
  public List selectAll() {
    return  jdbcTemplate.queryForList("select * from user limit 10");
  }
  
  @Override
  @DS("slave")
  public List selectByCondition() {
    return  jdbcTemplate.queryForList("select * from user where age >10 limit 10");
  }
}

3.在service层使用mybatis-plus整合多数据源

@Service
@DS("db2") // @DS注解可以使用在service实现类上
public class ModelServiceImpl extends ServiceImpl<ModelMapper, Model> implements IModelService {
  @Select("SELECT * FROM user order by id asc limit 10")
  @DS("slave") // @DS注解可以使用在service实现类的方法上
  List<User> selectUser();
}

 

 

 

 

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐