关于AbstractRoutingDataSource类的简介可以自行百度,不做阐述,这里只讲怎么用.
那么一步步来,既然要有多个数据源,就先定义多个数据库连接池:
我使用的是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),多数据库数据拼接增删改查....