springboot整合mybatis-plus、druid连接池和多数据源配置
在使用springboot开发业务应用程序的过程中,使用多数据源的场景很常见。目前,业界常用的spring boot整合多数据源的方案主要有两个,一个是Mapper分包方式,另一个是AOP切片方式。针对这种多数据源使用场景的痛点,MyBatis-plus团队开源了一个更为方便的解决方案(https://mp.baomidou.com/guide/dynamic-datasource.html),但
在使用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();
}
更多推荐
所有评论(0)