SpringBoot中怎么使用Dynamic Datasource配置多数据源,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
功能特性:
支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。
支持无数据源启动,支持配置懒启动数据源(3.3.2+)。
支持数据库敏感配置信息 加密 ENC()。
支持每个数据库独立初始化表结构schema和数据库database。
支持 自定义注解 ,需继承DS(3.2.0+)。
提供对Druid,Mybatis-Plus,P6sy,Jndi的快速集成。
简化Druid和HikariCp配置,提供 全局参数配置 。配置一次,全局通用。
提供 自定义数据源来源 方案。
提供项目启动后 动态增加移除数据源 方案。
提供Mybatis环境下的 纯读写分离 方案。
提供使用 spel动态参数 解析数据源方案。内置spel,session,header,支持自定义。
支持 多层数据源嵌套切换 。(ServiceA >>> ServiceB >>> ServiceC)。
提供对shiro,sharding-jdbc,quartz等第三方库集成的方案,注意事项和示例。
提供 基于seata的分布式事务方案。 附:不支持原生spring事务。
提供 本地多数据源事务方案。 附:不支持原生spring事务(3.3.1+)。
我们这篇文章主要实现读写分离,一主多从的环境。
主数据库建议只执行 INSERT、UPDATE、DELETE 操作。
从数据库建议只执行 SELECT 操作。
一、准备数据库
主库:PiaoDB
从库1:PiaoDB2
从库2:PiaoDB3
二、导入POM文件
引入dynamic-datasource-spring-boot-starter。
<!-- 多数据源 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.3.2</version> </dependency>
三、编辑配置文件
我们配置了一个主库、两个从库。
配置文件中所有以下划线 _ 分割的数据源“首部”即为组的名称,相同组名称的数据源会放在一个组下。
默认的数据源名称为 master ,我们可以通过 spring.datasource.dynamic.primary 修改。
spring: datasource: dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源. datasource: master: url: jdbc:mysql://localhost:3306/PiaoDB?serverTimezone=Asia/Shanghai username: root password: root driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置 slave_1: url: jdbc:mysql://localhost:3306/PiaoDB2?serverTimezone=Asia/Shanghai username: root password: root driver-class-name: com.mysql.jdbc.Driver slave_2: url: jdbc:mysql://localhost:3306/PiaoDB3?serverTimezone=Asia/Shanghai username: root password: root driver-class-name: com.mysql.jdbc.Driver
因为我们使用的是阿里数据库连接池 Druid,需要排除原生 Druid 的快速配置类。
其他第三方集成地址:集成Druid
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
某些springBoot的版本上面可能无法排除可用以下方式排除。
spring: autoconfigure: exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
除了配置一主多从,我们还可以配置。
# 多主多从 纯粹多库(记得设置primary) 混合配置 spring: spring: spring: datasource: datasource: datasource: dynamic: dynamic: dynamic: datasource: datasource: datasource: master_1: mysql: master: master_2: oracle: slave_1: slave_1: sqlserver: slave_2: slave_2: postgresql: oracle_1: slave_3: h3: oracle_2:
四、编写代码
使用 @DS 切换数据源。@DS 可以注解在方法上和类上。如果同时存在,方法注解优先于类上注解。强烈建议注解在 service 实现或 mapper 接口方法上。
@DS("xxx") 指定使用 xxx 这个数据源,xxx 可以为组名也可以为具体某个库的名称。如果是组名则切换时采用负载均衡算法切换。如果指定的组名或者库不存在,则自动使用默认数据源(主库)
如果没有 @DS,则使用默认数据源(主库)
如果设置了 @DS 但没有指定某个组或者库,则根据 DynamicDataSourceStrategy 策略,选择一个从库。默认负载均衡策略。
1、编写Controller
@RestController @RequiredArgsConstructor @RequestMapping("/demo") public class DemoController { private final DemoService demoService; @GetMapping("/add") public String add() { return demoService.add(null) + ""; } @GetMapping("/selectGoodsInfo") public List<GoodsInfo> selectGoodsInfo(){ return demoService.selectGoodsInfo(); } @GetMapping("/selectMasterGoodsInfo") public List<GoodsInfo> selectMasterGoodsInfo(){ return demoService.selectMasterGoodsInfo(); } }
2、编写Service
public interface DemoService { boolean add(GoodsInfo param); List<GoodsInfo> selectGoodsInfo(); List<GoodsInfo> selectMasterGoodsInfo(); }
@Service @RequiredArgsConstructor public class DemoServiceImpl implements DemoService { private final DemoMapper demoMapper; @DS("master") @Override public boolean add(GoodsInfo param) { param = new GoodsInfo(); param.setGname("1200元秒杀华为Pad"); param.setGnum(100); return demoMapper.insertGoodsInfo(param); } @DS("slave") @Override public List<GoodsInfo> selectGoodsInfo() { return demoMapper.selectGoodsInfo(); } @DS("master") @Override public List<GoodsInfo> selectMasterGoodsInfo() { return demoMapper.selectGoodsInfo(); } }
3、编写Mapper
@Mapper public interface DemoMapper { boolean insertGoodsInfo(GoodsInfo param); List<GoodsInfo> selectGoodsInfo(); }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.example.demo.mapper.DemoMapper"> <select id="selectGoodsInfo" resultType="com.example.demo.entity.GoodsInfo"> select * from t_goods_info </select> <insert id="insertGoodsInfo"> insert into t_goods_info (gname, gnum, gcreatetime) values (#{gname}, #{gnum}, now()); </insert> </mapper>
五、验证结果
1、请求新增接口(往主库添加数据):127.0.0.1:8086/demo/add
2、请求查询主库数据接口:127.0.0.1:8086/demo/selectMasterGoodsInfo
3、请求从库数据接口(负载均衡):
第一次请求:
第二次请求:
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。