zoukankan      html  css  js  c++  java
  • springboot动态数据源

    基层知识:

    springboot会默认通过DataSourceAutoConfiguration来注入所需要的数据源,通过数据源的getConnection()方法得到connection操作数据库

    我们要做的事:

    关闭默认的DataSourceAutoConfiguration(关闭后springBoot会从项目中找一个DataSource或实现DataBase的子类对象来作为系统的数据源),配置多个数据源(其中一个声明为@primary)primary的数据源中重写getConnection,getConnection方法从当前线程中来获取一个字符串来判断使用哪个数据源即可。

    由于每次访问数据都会执行一次getConnection(),所以对切换数据源的需求代码应该放在调用aaa()之前。

    具体实现:

    springBoot为我们提供了一个抽象类AbstractRoutingDataSource,我们继承它,并重写预留给我们来实现动态绑定的抽象方法determineCurrentLookupKey()即可,java多态会调用我们的实现代码。

    每次调用xxxMaper.xxx()方法时都会执行getConnect()方法(我想说的是会调用determineCurrentLookupKey()方法),所以我手工在需要的地方xxxMaper.xxx()前去切换数据源。

    问题:如果有懒加载,那么动态数据源会造成问题,比如:

    public List<Article> queryAllLazyload(Criteria<ArticleRequest> criteria) { //这是延迟加载的方法
      DataSourceContextHolder.setDB("db");
      PageHelper.startPage(criteria.getStartIndex() , criteria.getPageSize());
      List<Article> articles = articleMapper.queryAllLazyload(criteria);
      // DataSourceContextHolder.setDB("db2"); 如果此时切换数据源,如果两边数据不一致或db2根本没有查询的表,就会出问题或异常了.
      return articles;
    }

    ----------建议先看我上一篇博客收集的两个网址

  • 相关阅读:
    PAT 1037. 在霍格沃茨找零钱(20)
    PAT 1036. 跟奥巴马一起编程(15)
    Topcoder SRM633 DIV2 解题报告
    HDU 4565 So Easy! 矩阵快速幂 + 共轭数
    HDU 2256 Problem of Precision 矩阵快速幂 + 共轭数
    FZU 1683 纪念SlingShot 矩阵快速幂
    CodeForces 185A Plant 矩阵快速幂
    HDU 2604 Queuing 矩阵快速幂
    HDU 1575 Tr A 矩阵快速幂
    HDU 1757 A Simple Math Problem 矩阵快速幂
  • 原文地址:https://www.cnblogs.com/yanjunwu/p/9700382.html
Copyright © 2011-2022 走看看