项目上要用到多数据源,发现MybatisPlus从配置到切换数据源有一套快捷的实现,便选用了MybatisPlus的多数据源配置
本文的 dynamic-datasource-spring-boot-starter 与 mybatis-plus-boot-starter 依赖版本均为3.3.1
1. 引入依赖
<!-- MybatisPlus 多数据源自动装配 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${version}</version>
</dependency>
<!-- Druid自动装配 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.21</version>
</dependency>
2. 排除掉Druid原生的自动装配
druid-spring-boot-starter 的 DruidDataSourceAutoConfigure 会自动尝试装配数据源,不排除的话,由于配置结构不同,启动的时候会装配失败报错
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
较新版本的SpringBoot还支持通过配置排除
spring:
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
3. 配置数据源
-
Druid相关配置参照:Druid配置
-
MybatisPlus 官方配置说明,不过说明有些简陋:MyBatisPlus+Druid配置
-
配置示例:
# druid 数据源配置 spring: datasource: dynamic: # 设置默认的数据源或者数据源组,默认值即为master primary: master # 设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源. strict: false datasource: master: url: jdbc:oracle:thin:@localhost:1521:fintest username: admin password: admin driver-class-name: oracle.jdbc.OracleDriver druid: filter: stat,wall # 启用ConfigFilter config: enabled: true stat: enabled: true # 慢SQL记录 log-slow-sql: true slow-sql-millis: 30000 merge-sql: false wall: function-check: false strict-syntax-check: false multi-statement-allow: true ebs: url: jdbc:oracle:thin:@//localhost:1551/EBS username: ebs_reader password: ebs_reader driver-class-name: oracle.jdbc.OracleDriver # Druid个性化配置 druid: filter: stat,wall # 启用ConfigFilter config: enabled: true stat: enabled: true # 慢SQL记录 log-slow-sql: true slow-sql-millis: 2000 merge-sql: false wall: function-check: false strict-syntax-check: false multi-statement-allow: true test: url: jdbc:oracle:thin:@//localhost:1551/EBS username: ebs_reader password: ebs_reader driver-class-name: oracle.jdbc.OracleDriver druid: # 初始连接数 initialSize: 10 # 最小连接池数量 minIdle: 20 # 最大连接池数量 maxActive: 50 # 配置获取连接等待超时的时间,单位毫秒 maxWait: 30000 #sql 查询超时 queryTimeout: 1200 #执行一个事务的超时时间(秒) transactionQueryTimeout: 1200 #SQL 查询验证超时时间(秒),小于或等于 0 的数值表示禁用 validationQueryTimeout: 20 #设置是否保持连接活动心跳检测 keepAlive: true # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 10000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 # 配置一个连接在池中最大生存的时间,单位是毫秒 maxEvictableIdleTimeMillis: 600000 #标记是否删除泄露的连接,如果连接超出removeAbandonedTimeout的限制,且该属性设置为 true,则连接被认为是被泄露并且可以被删除 removeAbandoned: true #泄露的连接可以被删除的超时时间(秒),该值应设置为应用程序查询可能执行的最长时间 removeAbandonedTimeout: 1200 # 配置检测连接是否有效执行SQL validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: true testOnReturn: false # webStatFilter 与 statViewServlet 为Druid配置,但是MybatisPlus未将这两个配置映射进去,故而不生效 # webStatFilter: # enabled: true # # http://localhost:8008/druid/login.html # statViewServlet: # enabled: true # loginUsername: dms # loginPassword: dms
4. 程序切换数据源
MybatisPlus提供了AOP进行数据源的切换,使用 @DS 注解完成,以上面配置为例,不使用注解时默认为 master 数据源
// 整个类切换为 ebs 数据源,会被方法注解覆盖
@Service
@DS("ebs")
public class DemoServiceImpl implements DemoService {
private final JdbcTemplate jdbcTemplate;
@Override
public List ebsSelect() {
return jdbcTemplate.queryForList("SELECT 1 FROM DUAL");
}
// 切换为 test 方法注解优先级比类注解高
@Override
@DS("test")
public List testSelect() {
return jdbcTemplate.queryForList("SELECT 1 FROM DUAL");
}
}
5. 配置踩坑
MybatisPlus里的Druid配置会因为版本问题,与Druid有细微的差异,如果是照搬老项目的Druid配置出了问题,最好检查下配置的结构对照关系。
可查看 com.baomidou.dynamic.datasource.spring.boot.autoconfigure.druid.DruidConfig 类的结构和处理逻辑。
新项目照搬老项目的Druid配置,因为 filter 和 wall 的配置结构变更,导致部分SQL检查没关闭,部分Oracle方言执行报错,找了半天
1230

被折叠的 条评论
为什么被折叠?



