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

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

原文地址:https://www.cnblogs.com/yanjunwu/p/9700382.html