首页 > 其他分享 >带你看懂RuoYi动态数据源切换

带你看懂RuoYi动态数据源切换

时间:2023-06-12 16:33:52浏览次数:43  
标签:jdbc spring mysql RuoYi 切换 数据源 properties JdbcTemplate



文章目录

  • 数据源是什么
  • 一、spring中是如何处理各种数据源的?
  • 1.开搞springboot
  • 2.创建一个测试类
  • 二、有了如上的理论,那么想想动态切换数据源吧
  • 参考若依的动态数据源配置
  • 总结



数据源是什么

数据源,对于java来说,就是可用的数据库,那么我平时开发的springboot springcloud项目,那么也就是yml或者properties中的链接信息, 例如 mysql redis influx mongodb sqlserver clickhouse nebula-graph …
一般在spring中,都已经对其做好了封装


一、spring中是如何处理各种数据源的?

那就不得不说下JdbcTemplate 了,只要是各种遵循了jdbc标准的数据源,也就是大部分的关系型数据库,都是可以通过它来操作的;简直就是神奇~~ 怎么使用呢?

1.开搞springboot

搞一个springboot项目 由于我使用了mysql,所以还引入了mysql驱动包

<dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-jdbc</artifactId>
      </dependency>
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
         <scope>runtime</scope>
      </dependency>

然后在yml加入相应配置

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://xxxxx:3307/yuque
    username: root
    password: 123456

2.创建一个测试类

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
class WordApplicationTests1 {

    @Test
    void contextLoads() {
    }

    @Autowired
    JdbcTemplate jdbcTemplate;

    @SneakyThrows
    @Test
    public void query() {
        List<Bom> bomList = jdbcTemplate.query("select DISTINCT * from bom", new BeanPropertyRowMapper<>(Bom.class));

        System.out.println(JSONUtil.toJsonStr(bomList));
    }
}

相当于可以了,用的就是yml中的配置查询的数据库

带你看懂RuoYi动态数据源切换_java

  • 我有一个想法,我想查询一个其他的库的数据,但是之前的yml中的我还想用

改造后,变成了

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
class WordApplicationTests1 {

    @Test
    void contextLoads() {
    }

    @Autowired
    JdbcTemplate jdbcTemplate;

    @SneakyThrows
    @Test
    public void query() {
        List<Bom> bomList = jdbcTemplate.query("select DISTINCT * from bom", new BeanPropertyRowMapper<>(Bom.class));

        System.out.println(JSONUtil.toJsonStr(bomList));

        Properties properties = new Properties();
        properties.put("url", "jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true");
        properties.put("username", "root");
        properties.put("driverClassName", "com.mysql.jdbc.Driver");
        properties.put("password", "root");

        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
        JdbcTemplate template = new JdbcTemplate(dataSource);

        List<Bom> list = template.query("select * from bom", new BeanPropertyRowMapper<>(Bom.class));
        System.out.println(JSONUtil.toJsonStr(list));
    }
}

还是能用的,两个都能查询出数据

带你看懂RuoYi动态数据源切换_数据库_02


那…请小伙伴思考下,如果是用jdbc弄一个动态数据源,是不是也不是很难,我需要用哪个库的信息,就让他加载哪个库的配置信息就ok了呀.对吧?

甚至,我可以将配置信息放入数据库中,启动后,一次性加载到内存,并实例化相应的datasource 实例,然后在实例化相应的jdbctemplete,放入到的全局中,那么我就可以自如切换了!!!

二、有了如上的理论,那么想想动态切换数据源吧

参考若依的动态数据源配置

若依 大体思路如下:

  • 首先利用本地线程搞一个缓存,目的是为了存放当前可用的数据源,这样就可以设置/移除 某个数据源了;
DynamicDataSourceContextHolder 仅仅是个缓存
  • 由于为了使用方便,所以他自定义了注解,用来切换数据源,也就是更改上面的当前线程缓存,那么自定义之后,就需要通过切面去实现这个自定义的注解,里面的中心思想就是获取传入的可用数据源(可能有多个),替换之为当前数据源(只能有一个);
DataSourceAspect 切面实现切换
  • 那么多个数据源是从哪里来的呢,是在项目启动的时候,他就已经把可用数据源都实例化好了,然后存放起来了,就像我之前分析的那样,关键点就是 实现这个方法 AbstractRoutingDataSource 其中 放入一个map 就是数据源本尊了
DruidConfig 把所有数据源都加载进去了
  • 之后就可以通过map.getkey 那样,获取到自己想要的数据源了;然后更改本地线程的数据源
  • 切换之后,查询的时候,就会重新查询到当前设置后的数据源,然后再去查询
  • 为啥用ThreadLocal呢? 因为我只想针对此次查询修改为其他数据源有效,此次结束之后,当前线程销毁;下次查询不指定的情况下默认仍然是原来的数据源,否则将就此改变了整个项目的数据源;

重点中的重点

DynamicDataSource extends AbstractRoutingDataSource
@Override
   protected Object determineCurrentLookupKey(){
       return DynamicDataSourceContextHolder.getDataSourceType();// 每次执行都会重新获取新值
   }

带你看懂RuoYi动态数据源切换_mysql_03


总结

通过此次JdbcTemplate 的数据源切换,想到了之前看过的若依项目中的多数据源切换问题,这次带着我自己的想法去看,果然再次阅读,收获颇丰;算是彻底看懂了吧;
希望我的理解能为你带来启发;
当然现在已经有了dynamic-datasource-spring-boot-starter 这样的多数据start 完成了类似的功能,但是看看之前的,也能对于它有更好的理解;相当于自己手写了一个简易的 dynamic-datasource-spring-boot-starter


标签:jdbc,spring,mysql,RuoYi,切换,数据源,properties,JdbcTemplate
From: https://blog.51cto.com/u_16158506/6463452

相关文章

  • 花了半天时间,使用spring-boot实现动态数据源,切换自如
      在一个项目中使用多个数据源的情况很多,所以动态切换数据源是项目中标配的功能,当然网上有相关的依赖可以使用,比如动态数据源,其依赖为,<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.1</v......
  • Ctrl+Space输入法切换状态解决方法
    WindowsRegistryEditorVersion5.00[HKEY_USERS\.DEFAULT\ControlPanel\InputMethod\HotKeys\00000010]"KeyModifiers"=hex:00,c0,00,00"TargetIME"=hex:00,00,00,00"VirtualKey"=hex:ff,00,00,00[HKEY_USERS\.DEFAULT......
  • PPT切换方式
    作为在工作中经常会跟PPT打交道的小伙伴来说,有些切换的动画效果确实非常的有趣和惊艳。当然适当的使用动画效果会帮助我们PPT起到加分的效果,而前提是我们需要懂这个切换动画的设定。今天就来跟大家分享一下,这7个简单实用又好玩的PPT切换方式。一、平滑说到平滑,想必大家都不陌生,目前......
  • application.properties的数据源配置
    #驱动类名称spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver#数据库连接的urlspring.datasource.url=jdbc:mysql://localhost:3306/tlias?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC#连接数据库的用户名spring.datasource.username=......
  • 物理备库在切换为主库时报错ORA-01577—主库已切换为备库
    问题描述:物理备库在切换为主库时报错ORA-01577,如下所示:数据库:oracle11.2.0.4系统架构:rac(2节点)+dg1、异常重现SYS@orcldg>alterdatabasecommittoswitchovertoprimarywithsessionshutdown;alterdatabasecommittoswitchovertoprimarywithsessionshutdown*......
  • Windows下Rust toolchain的切换
    在用运行命令cargoinstallcargo-eval的过程中,总是提示链接器错误。因为原先使用的rusttoolchain是GNU的,怀疑是GNU的链接器有问题,毕竟Windows下实际上还是MSVC最稳,所以尝试切换成MSVC,果然问题就解决了,cargo-eval成功安装。以下是步骤:下载VisualStudio。在VisualStudioIns......
  • vuex使用,Router使用(做两个主页面的跳转),路由守卫(对路由进行权限控制),路由的工作模式
    vuex使用使用的流程文件中的代码前端页面<template><div><h1>使用vuex</h1>购物车商品数量:{{num}}购物车的数量:{{$store.state.num}}<br><button@click="yjx">加数量</button></div></template><sc......
  • 关于dev report 数据源的排序 report修改的问题
    因为报表的建立很多是复制的别的类型差不多的报表得来,结果造成一些莫名其妙的问题比如数据源的排序被控件改了,因为有分组小计分组的字段等设置会影响排序.正常的设计是这样的  groupheader2为何也要group因为这个表头需要在分页的时候也要显示,也只有用group的band才有......
  • prefers-color-scheme与color-scheme自由切换网站主题背景色变化
    部分转自:布依前端和前端侦探prefers-color-schemeprefers-color-scheme这个新的css特性,想必大家并不陌生,写文章的目的就是分享给大家怎么正确用好它以及提升网站用户体验。prefers-color-scheme是CSS 媒体特性【@media】用于检测用户是否有将操作系统的主题色设置为亮色【light】......
  • qt按钮切换互斥功能
    有这样一种功能:一组按钮,点击其中一个,该按钮被选中,其他按钮取消选中。  我这里简单说一下方法。创建一个继承自QFrame的窗口类,在上面放几个按钮,按钮属性设置如下:然后设置按钮的qss,下面是其中一个的按钮(其他按钮类似):data文件夹和exe所在的文件夹在同一目录,下面有几个图片......