核心思想:Spring在每次操作数据库的时候都会通过AbstractRoutingDataSource类中的determineTargetDataSource()方法获取当前数据源,我们就可以通过切面技术,在不同的切面,切入不同的数据源名称,使Spring获取的时候拿到的是不同的数据源。
而determineCurrentLookupKey()
方法是抽象的,所以,我们可以实现这个类,重写determineCurrentLookupKey方法,通过切面技术实现多数据源之间切换
具体实现如下
Spring 中DataSource的定义如下
DynamicDataSource.java
DataSourceInterceptor.java
DatabaseContextHolder.java
ThreadLocalUtils.java
如上操作之后,只需要将需要不同Datasource的Mapper层配置在Spring的DataSource切面配置中就可以实现多数据源的自由切换。
总结
这个方案完全是在spring的框架下解决的,数据源依然配置在spring的配置文件中,sessionFactory依然去配置它的dataSource属性,它甚至都不知道dataSource的改变。唯一不同的是在真正的dataSource与sessionFactory之间基于Decorator(装饰者)模式增加了一个MultiDataSource。
参考资料
Spring mvc动态多数据源
spring框架中多数据源创建加载并且实现动态切换的配置实例代码