引入依赖
<!--基于springboot的快速集成多数据源的启动器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<!--druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
yml配置
spring:
autoconfigure:
# 排除掉druid的原生配置
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
datasource:
dynamic:
# 以下是全局默认值,可以全局更改(所有数据源, 可以针对数据源做单独设置)
druid:
# 监控统计拦截的filters
filters: stat
# 配置初始化大小/最小/最大
initial-size: 1
min-idle: 1
max-active: 20
# 获取连接等待超时时间
max-wait: 60000
# 间隔多久进行一次检测,检测需要关闭的空闲连接
time-between-eviction-runs-millis: 60000
# 一个连接在池中最小生存的时间
min-evictable-idle-time-millis: 300000
validation-query: SELECT 'x'
test-while-idle: true
test-on-borrow: false
test-on-return: false
# 打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为false
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
stat:
merge-sql: true
log-slow-sql: true
slow-sql-millis: 2000
# 设置默认的数据源或者数据源组,默认值即为master
primary: master
# 设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候回抛出异常,不启动会使用默认数据源
strict: false
datasource:
# 智慧营销数据源
master:
url: jdbc:mysql://localhost:3306/bicReport?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
username: ucds
password: ucds
driver-class-name: com.mysql.jdbc.Driver
# 计费系统数据源
cbs:
url: jdbc:mysql://localhost:3306/cbs?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
username: root
password: MYSQL-ucloud-2020
driver-class-name: com.mysql.jdbc.Driver
# 内控系统数据源
ics:
url: jdbc:mysql://localhost:3306/ics?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
username: root
password: MYSQL-ucloud-2020
driver-class-name: com.mysql.jdbc.Driver
########下面可以针对某个数据源进行个性化设置#############
#druid: # 以下参数针对每个库可以重新设置druid参数
#initial-size:
#validation-query: select 1 FROM DUAL #比如oracle就需要重新设置这个
#public-key: #(非全局参数)设置即表示启用加密,底层会自动帮你配置相关的连接参数和filter。
使用
service 层添加数据源名称
也可以在mapper层添加数据源名称, 注解一样
@Service
@DS("master")
public class CostSummaryServiceImpl extends ServiceImpl<CostSummaryMapper, CostSummary>
implements CostSummaryService {
}
注意
-
不添加使用默认数据源(primary), 上面配置中严格内模式strict: true时好像不添加也是会执行默认数据源;
-
嵌套事务不会生效, 且在使用事务的service层方法中, 不会切换数据源,因为事务是在Connection实现, 而切换数据源会切换connection实现;详见: https://blog.csdn.net/w57685321/article/details/106823660/ ;
-
serviceA(ics) serviceB(不写数据源) serviceC(master): A 中调用B和C, 两种情况:
加了事务: 全部使用数据源A;
不加事务: A使用数据源ics, B使用数据源ics(注意并没有使用默认的master), C使用数据源master。