• 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;
    }

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

  • 相关阅读:
    Android升级ADT22后会报ClassNotFoundException的原因分析
    修改Android解锁界面
    Android中dip, dp, px,pt, sp之间的区别:
    移动开发:Android官方提供的支持不同屏幕大小的全部方法
    常用正则表达式
    Android多语言与国际化
    Android中的资源与国际化
    Android开发:使用Fragment改造TabActivity
    Android开发–Intent-filter属性详解
    Fragment、Activity比较——Android碎片介绍
  • 原文地址:https://www.cnblogs.com/yanjunwu/p/9700382.html
Copyright © 2020-2023  润新知