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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值