千家信息网

springboot配置多数据源框架的示例分析

发表于:2024-11-25 作者:千家信息网编辑
千家信息网最后更新 2024年11月25日,本篇文章为大家展示了springboot配置多数据源框架(dynamic-datasource-spring-boot-starter),内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详
千家信息网最后更新 2024年11月25日springboot配置多数据源框架的示例分析

本篇文章为大家展示了springboot配置多数据源框架(dynamic-datasource-spring-boot-starter),内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

框架简介

dynamic-datasource-spring-boot-starter 是一个基于 springboot 的快速集成多数据源的启动器

框架说明

  • 本框架只做 切换数据源 这件核心的事情,并不限制你的具体操作,切换了数据源可以做任何 CRUD

  • 配置文件所有以下划线 _ 分割的数据源 首部 即为组的名称,相同组名称的数据源会放在一个组下

  • 切换数据源可以是组名,也可以是具体数据源名称。组名则切换时采用负载均衡算法切换

  • 默认的数据源名称为 master ,你可以通过 spring.datasource.dynamic.primary 修改

  • 方法上的注解优先于类上注解

  • DS 支持继承抽象类上的 DS,暂不支持继承接口上的 DS

与 springboot 的整合

数据准备
  • springboot 版本:2.0.6.RELEASE

  • mysql 版本:5.7

分别创建数据库 test1,test2,数据库表均为 goods,数据不相同

CREATE TABLE `goods` (  `goodsId` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',  `goodsName` varchar(500) NOT NULL DEFAULT '' COMMENT 'name',  `subject` varchar(200) NOT NULL DEFAULT '' COMMENT '标题',  `price` decimal(15,2) NOT NULL DEFAULT '0.00' COMMENT '价格',  `stock` int(11) NOT NULL DEFAULT '0' COMMENT 'stock',  PRIMARY KEY (`goodsId`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT='商品表';

test1 数据库数据如下

test2 数据库数据如下

引入依赖

至于其他依赖,不再赘述

        com.baomidou        dynamic-datasource-spring-boot-starter        3.3.2
springboot 配置文件

配置文件详情可以参考官方文档

server.port=8080#设置test1为主数据源spring.datasource.dynamic.primary=master#test1主数据源配置spring.datasource.dynamic.datasource.master.url=jdbc:mysql://127.0.0.1:3306/test1?characterEncoding=utf8&useSSL=false&autoReconnect=true&serverTimezone=UTCspring.datasource.dynamic.datasource.master.username=rootspring.datasource.dynamic.datasource.master.password=123456spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.jdbc.Driverspring.datasource.dynamic.datasource.master.type=com.alibaba.druid.pool.DruidDataSource#druid连接池配置spring.datasource.dynamic.datasource.master.druid.initial-size=5spring.datasource.dynamic.datasource.master.druid.max-active=20spring.datasource.dynamic.datasource.master.druid.min-idle=5spring.datasource.dynamic.datasource.master.druid.max-wait=60000#test2从数据源配置spring.datasource.dynamic.datasource.slave.url=jdbc:mysql://127.0.0.1:3306/test2?characterEncoding=utf8&useSSL=false&autoReconnect=true&serverTimezone=UTCspring.datasource.dynamic.datasource.slave.username=rootspring.datasource.dynamic.datasource.slave.password=123456spring.datasource.dynamic.datasource.slave.driver-class-name=com.mysql.jdbc.Driverspring.datasource.dynamic.datasource.slave.type=com.alibaba.druid.pool.DruidDataSource#druid连接池配置spring.datasource.dynamic.datasource.slave.druid.initial-size=5spring.datasource.dynamic.datasource.slave.druid.max-active=20spring.datasource.dynamic.datasource.slave.druid.min-idle=5spring.datasource.dynamic.datasource.slave.druid.max-wait=60000#mybatis配置mybatis.mapper-locations=classpath:org/example/mapper/*.xmlmybatis.configuration.cache-enabled=true#开启驼峰命名mybatis.configuration.map-underscore-to-camel-case=true#打印SQLmybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

启动类

需要排除掉 DruidDataSourceAutoConfigure 类,不然启动会报错找不到配置的 url

@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)@Slf4jpublic class App {    public static void main(String[] args) {        SpringApplication.run(App.class, args);        log.info("------springboot running-----");    }}

实体类

@Data@ApiModelpublic class Goods implements Serializable {    @ApiModelProperty(value = "商品id")    private Long goodsid;    @ApiModelProperty(value = "商品名称")    @NotBlank(message = "商品名称不能为空")    private String goodsname;    @ApiModelProperty(value = "商品描述")    @NotBlank(message = "商品描述不能为空")    private String subject;    @ApiModelProperty(value = "商品价格")    @NotNull(message = "商品价格不能为空")    private BigDecimal price;    @ApiModelProperty(value = "商品库存", example = "0")    @NotNull(message = "商品库存不能为空")    private Integer stock;}

service

至于 dao 层,使用的是 mybatis-generator 插件自动生成

@Servicepublic class GoodServiceImpl implements GoodService {    @Autowired    private GoodsMapper goodsMapper;    @Override    public Goods selectOneGoods(Long goodsid) {        return goodsMapper.selectByPrimaryKey(goodsid);    }    @Override    public int addGoods(Goods goods) {        return goodsMapper.insertSelective(goods);    }}

controller

@Controller@RequestMapping(path = "/goods")@Api(tags = "商品管理相关接口")@Slf4jpublic class GoodsController {    @Autowired    private GoodService goodService;    @GetMapping(path = "/selectOne")    @ResponseBody    @ApiOperation(value = "查询商品接口")    @ApiImplicitParam(name = "id", value = "商品id", required = true)    public ResultMap selectOne(@RequestParam(name = "id", defaultValue = "3") Long goodsid) {        Goods goods = goodService.selectOneGoods(goodsid);        log.info("查询到的商品数据:" + goods.toString());        if (StringUtils.isEmpty(goods)) {            return new ResultMap().fail().message("查询失败,没有您要的数据");        }        return new ResultMap().success().message("查询成功").data(goods);    }    @PostMapping(path = "/addGoods")    @ResponseBody    @ApiOperation(value = "添加商品的接口")    public ResultMap addGoods(@Valid Goods goods, @NotNull BindingResult bindingResult) {        if (bindingResult.hasErrors()){            String defaultMessage = Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage();            return new ResultMap().fail().message(defaultMessage);        }        int i = goodService.addGoods(goods);        if (i > 0) {            return new ResultMap().success().message("添加成功");        }        return new ResultMap().fail().message("添加失败");    }}

测试 service 层方法上都没有注解 @DS

使用 postman 测试第一个接口

使用 postman 测试第二个接口


以上两个接口测试说明:它们都默认操作的是主数据源 test1,证明我们配置文件中配置的主数据源 test1 是配置正确的,已经生效

service 层方法上加上注解 @DS 再测试

@Servicepublic class GoodServiceImpl implements GoodService {    @Autowired    private GoodsMapper goodsMapper;    @DS(value = "slave")// 切换数据源,并指定要访问的数据库名称    @Override    public Goods selectOneGoods(Long goodsid) {        return goodsMapper.selectByPrimaryKey(goodsid);    }    @Override    public int addGoods(Goods goods) {        return goodsMapper.insertSelective(goods);    }}

使用 postman 测试第一个接口

此时 @DS 注解已生效,发生了数据源的动态切换

使用 postman 测试第二个接口

由于该接口没有 @DS 注解,所以没有发生数据源的切换,依然操作的是 test1 默认数据源

@DS 注解说明

注解结果
没有@DS默认数据源
@DS("dsName")dsName可以为组名也可以为具体某个库的名称
  • @DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解

  • @DS 官方建议使用在 service 层的方法上

上述内容就是springboot配置多数据源框架(dynamic-datasource-spring-boot-starter)的示例分析,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

0