2022-09-08
Views
有个需求这样的,把我们现在系统平台的业务库的数据统计放到一个库中,交付给实施使用。我们平台涉及到的系统很多,每个系统都有自己独立的数据库。 我们打算提供的后台服务专门做这个统计。数据处理上可以让各个系统提供http接口,也可以直连各个系统数据库。考虑到各个系统提供http接口的话,依赖比较强,不利于灵活交付。 我们最终决定的方案是:直连各个数据库进行汇总,因此涉及到了多数据源的需求。 区分mapper,不同的mapper由不同的数据源管理。 整体流程:对mapper进行切换,将数据源信息维护的ThreadLocal中,另外是实现AbstractRoutingDataSource抽象类,根据ThreadLocal中的数据源信息路由到特定的数据源。 和方案二类似,是对方案二的封装。但是方案二是对mapper层进行切面,不适合也不能做service的切面,原因是是service层下的mapper会存在多个数据源的mapper调用,如果仅仅使用ThreadLocal则会丢失数据源信息,因此该框架的ThreadLocal维护的是一个栈,在栈上维护数据源信息,用于支持嵌套切面。 最终选的是:方案三 参考:需求背景
方案
方案一: 拆分Mapper配置不同的数据源
方案二:基于Mapper层AOP的动态数据源切换
方案三:dynamic-datasource-spring-boot-starter
springboot+mybatis多数据源实现原理 - 掘金 (juejin.cn)
dynamic-datasource-spring-boot-starter 源码解析 - 掘金 (juejin.cn)