数据源路由器AbstractRoutingDataSource----实现运行时多数据源自由切换

关于AbstractRoutingDataSource类的简介可以自行百度,不做阐述,这里只讲怎么用.

核心:在执行jdbc操作前从众多数据源选择指定的数据库连接池执行jdbc操作

一切以这个核心为基础!

那么一步步来,既然要有多个数据源,就先定义多个数据库连接池:

我使用的是HikariCP连接池,配置了四个数据源,太长,不展开了,反正就是跟配置单数据源一模一样的写复制粘贴四遍-_-

这样,我们有了核心内容中的很多可以选择的数据源

接下来要做的就是如何进行选择

首先是配置选择用的路由器(不是开wifi的那玩意-__-虽然核心原理一样)

AbstractRoutingDataSource这个类,既然叫路由,就说明是按照一定的规则去选取数据源的,那么就需要我们去定义这个选取规则:

public class CustomDataSource extends AbstractRoutingDataSource
{
	@Override
	protected Object determineCurrentLookupKey()
	{
		return SpringParam.getDbType();
	}
}

这里我采用网上较为主流的线程变量方式来配置路由选择规则,这样可以保证变量的线程安全,具体可以理解为避免多线程读写变量产生脏读

然后把各个连接池加入到这个路由器里,之后把这个路由器作为一个大的DataSource注册到Spring中

具体就是用map键值对,加入四个连接池加,然后写入路由里,然后指定个啥规则都找不到的情况所需的默认数据源

注意这里有个afterPropertiesSet,这里我之前碰到一个坑,就是完成上述配置,没写afterPropertiesSet,运行时总是提示路由未配置,后来查阅资料,加上afterPropertiesSet让路由配置立即生效

然后这个路由器就像普通的datasource一样注册到spring中了,可以被其他orm框架使用,比如mybatis:

此时已经实现了多数据源的注入,启动项目时,所有的数据源同时激活并待命,不做选择时,将返回上面配置的默认数据源.

接下来就是如何选择.

这里我总结网上的方法以及我自己对反射,注解,aop等掌握的知识,整理出的思路 : 在需要做出选择的地方打切点,在执行jdbc操作前给定AbstractRoutingDataSource路由器规则,切面执行前注入所需规则的数据源.

按照这个思路,先确定:切哪里?怎么切?

我这里建议选择跟数据源关联较大的地方取切;在执行操作前取切;

我选择的切点是在mybatis执行mapper前后,这样不与业务重合,有明确的目的性.我采用的也是主流的自定义注解来确定规则.

在切面加前通知,反射这个切点获取自定义的注解,读取里面写的规则,加入到线程变量,这样AbstractRoutingDataSource就可以按照规则返回给mybatis指定的数据源.

在切面加后通知,清除当前线程变量.

然后在mapper类里要选择数据源的方法上加上@DataSourceType这个我自定义的注解:

这样在执行getAppSysName方法时就会选择我选择的规则为AvmonDataSource的数据源进行一个查询操作

从始至终就是围绕核心进行的,配置可能稍微麻烦点,毕竟便宜不是白来的嘛...

以上就是AbstractRoutingDataSource进行多数据源的配置及使用,有了这个,我们可以很欢快的写出数据库克隆,数据实时双库备份,主从数据库故障切换(用try,catch),多数据库数据拼接增删改查....

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值