SpringBoot-Mybatis多数据源方案

2022-09-08 Views SpringBoot

需求背景

有个需求这样的,把我们现在系统平台的业务库的数据统计放到一个库中,交付给实施使用。我们平台涉及到的系统很多,每个系统都有自己独立的数据库。

我们打算提供的后台服务专门做这个统计。数据处理上可以让各个系统提供http接口,也可以直连各个系统数据库。考虑到各个系统提供http接口的话,依赖比较强,不利于灵活交付。

我们最终决定的方案是:直连各个数据库进行汇总,因此涉及到了多数据源的需求。

方案

方案一: 拆分Mapper配置不同的数据源

区分mapper,不同的mapper由不同的数据源管理。

方案二:基于Mapper层AOP的动态数据源切换

整体流程:对mapper进行切换,将数据源信息维护的ThreadLocal中,另外是实现AbstractRoutingDataSource抽象类,根据ThreadLocal中的数据源信息路由到特定的数据源。

方案三:dynamic-datasource-spring-boot-starter

和方案二类似,是对方案二的封装。但是方案二是对mapper层进行切面,不适合也不能做service的切面,原因是是service层下的mapper会存在多个数据源的mapper调用,如果仅仅使用ThreadLocal则会丢失数据源信息,因此该框架的ThreadLocal维护的是一个栈,在栈上维护数据源信息,用于支持嵌套切面。

最终选的是:方案三

参考:
springboot+mybatis多数据源实现原理 - 掘金 (juejin.cn)
dynamic-datasource-spring-boot-starter 源码解析 - 掘金 (juejin.cn)