首页 > 其他分享 >spring boot 多数据源切换(dynamic-datasource-spring-boot-starter)

spring boot 多数据源切换(dynamic-datasource-spring-boot-starter)

时间:2023-10-03 14:03:29浏览次数:42  
标签:spring mysql boot dynamic datasource 数据源 com public

官网 https://dynamic-datasource.com/guide/
集成MybatisPlus https://dynamic-datasource.com/guide/integration/MybatisPlus.html#基础介绍
自动读写分离 https://dynamic-datasource.com/guide/advance/Read-Write-Separation.html
本地事物(不支持spring事务),使用@DSTransactional https://dynamic-datasource.com/guide/tx/Local.html
约定
本框架只做 切换数据源 这件核心的事情。
配置文件所有以下划线 _ 分割的数据源 首部 即为组的名称,相同组名称的数据源会放在一个组下。
切换数据源可以是组名,也可以是具体数据源名称。组名则切换时采用负载均衡算法切换。
默认的数据源名称为 master ,你可以通过 spring.datasource.dynamic.primary 修改。
方法上的注解优先于类上注解。
使用方法
<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  <version>3.3.1</version>
</dependency>

server:
  port: 8083
spring:
  application:
    name: spring-boot-dynamic-datasource
  jackson:
    default-property-inclusion: non_null
    date-format: YYYY-MM-dd HH:mm:ss
    time-zone: GMT+8
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      datasource:
        master:
          url: jdbc:mysql://localhost:3306/dkn-shop-master?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
        slave_1:
          url: jdbc:mysql://localhost:3306/dkn-shop-slave-1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
        slave_2:
          url: jdbc:mysql://localhost:3306/dkn-shop-slave-2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
        user:
          url: jdbc:mysql://localhost:3306/dkn-dynamic-user?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver



logging:
  level:
    com.dkn: debug
    org.springframework.web: trace
    com.baomidou: trace

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

@RestController
@RequestMapping("/Shop")
public class ShopController {

	@Autowired
	private ShopService shopService;

	@Autowired
	private SysUserService sysUserService;

	//获取订单信息 从库操作,
	@GetMapping("getOrder")
	public AjaxResult getOrder(Integer id){
		ShopOrder shopOrder = shopService.getOrder(id);
		return AjaxResult.success(shopOrder);
	}

	//购买商品 主库操作
	@GetMapping("buy")
	public AjaxResult buy(Integer id,Integer num){
		shopService.buy(id,num);
		return AjaxResult.success();
	}

	//获取用户信息
	@GetMapping("getUserInfo")
	public AjaxResult getUserInfo(Integer userid){
		SysUser user = sysUserService.getById(userid);
		return AjaxResult.success(user);
	}
	
}

@Service
@DS("user")
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper,SysUser> implements SysUserService {
		
	
}

@Service
public class ShopServiceImpl implements ShopService {

    @Autowired
    ShopStoreMapper shopStoreMapper;
    @Autowired
    ShopOrderMapper shopOrderMapper;

    @DS("slave")
    public ShopOrder getOrder(Integer id) {
        return shopOrderMapper.selectById(id);
    }

    @DSTransactional
    public void buy(Integer productid, Integer buyNum) {
        ShopOrder shopOrder=new ShopOrder();
        shopOrder.setProductid(productid);
        shopOrder.setBuynum(buyNum);
        shopOrderMapper.insert(shopOrder);

        int a=1/0;

        UpdateWrapper<ShopStore> updateWrapper=new UpdateWrapper<ShopStore>();
        updateWrapper.setSql("storenum = storenum - "+buyNum);
        updateWrapper.eq("productid", productid);
        shopStoreMapper.update(null,updateWrapper);

    }
}

标签:spring,mysql,boot,dynamic,datasource,数据源,com,public
From: https://blog.51cto.com/u_16270511/7691801

相关文章

  • JDWP调试SpringBoot程序
    JDWP调试SpringBoot程序<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-loader</artifactId></dependency>java-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5050-jar&......
  • Springboot+Echarts+Element(二)
    今天主要是记录一些问题,主要是在使用vue通过axios发送请求的时候,起初我认为需要把vue和springboot整合到一块但是在听完课之后发现并不需要,因为vue的目的是实现前后端分离的开发,因此两个项目可以同时运行,调整vue项目就是改前端代码,调整springboot就是改后端代码,前端只负责发送请......
  • Spring框架
    什么是SpringSpring是分层的JavaEE应用一站式的轻量级开源框架,以控制反转(InverseorControl,loC)和面向切面编程(AspectOrientedProgramming,AOP)为内核,提供了表现层SpringMVC、持久层SpringJDBC以及业务层事务管理的众多的企业级应用技术。Spring整合了大量著名的第三方框架和......
  • linux系统中固化和更新uboot、zImage和dtb方法(经典)
      大家好,今天给大家介绍一下imx6ull固化和更新uboot、zImage和dtb方法总结,希望这篇文章对大家有所帮助。进行固化和更新的前提,uboot.imx、zImage、imx6ull.dtb和rootfs已经编译好,并且能成功启动和挂载。在讲解imx6ull固化和更新uboot、zImage和dtb方法之前,先带大家了解一些imx6u......
  • linux系统中u-boot命令的EMMC和SD卡操作命令分析
    今天给大家详细的介绍一下u-boot命令之EMMC和SD卡操作的mmc命令使用。希望这篇文章对大家有所帮助。uboot支持EMMC和SD卡,因此也要提供EMMC和SD卡的操作命令。一般认为EMMC和SD卡是同一个东西,所以没有特殊说明,统一使用MMC来代指EMMC和SD卡。uboot中常用于操作MM......
  • Spring Event 观察者模式, 业务解耦神器
    观察者模式在实际开发过程中是非常常见的一种设计模式。SpringEvent的原理就是观察者模式,只不过有Spring的加持,让我们更加方便的使用这一设计模式。一、什么是观察者模式概念:观察者模式又叫发布-订阅模式。发布指的是当目标对象的状态改变时,它就向它所有的观察者对象发......
  • Spring Event 观察者模式, 业务解耦神器
    观察者模式在实际开发过程中是非常常见的一种设计模式。SpringEvent的原理就是观察者模式,只不过有Spring的加持,让我们更加方便的使用这一设计模式。一、什么是观察者模式概念:观察者模式又叫发布-订阅模式。发布指的是当目标对象的状态改变时,它就向它所有的观察者对象发......
  • Spring Event 观察者模式, 业务解耦神器
    观察者模式在实际开发过程中是非常常见的一种设计模式。SpringEvent的原理就是观察者模式,只不过有Spring的加持,让我们更加方便的使用这一设计模式。一、什么是观察者模式概念:观察者模式又叫发布-订阅模式。发布指的是当目标对象的状态改变时,它就向它所有的观察者对象发......
  • Spring Event 观察者模式, 业务解耦神器
    观察者模式在实际开发过程中是非常常见的一种设计模式。SpringEvent的原理就是观察者模式,只不过有Spring的加持,让我们更加方便的使用这一设计模式。一、什么是观察者模式概念:观察者模式又叫发布-订阅模式。发布指的是当目标对象的状态改变时,它就向它所有的观察者对象发......
  • Spring Event 观察者模式, 业务解耦神器
    观察者模式在实际开发过程中是非常常见的一种设计模式。SpringEvent的原理就是观察者模式,只不过有Spring的加持,让我们更加方便的使用这一设计模式。一、什么是观察者模式概念:观察者模式又叫发布-订阅模式。发布指的是当目标对象的状态改变时,它就向它所有的观察者对象发......