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;
}
----------建议先看我上一篇博客收集的两个网址