需求说明
最近接触到一个新的系统,隶属中台系统中的订单中心模块,目前现有的数据量已经远远超过1千万,而新的架构是舍弃掉了oracle,为了满足在mysql架构的查询效率问题和未来数据量下系统预留,本次会做成使用一致性哈希算法对订单号进行分表存储,减轻数据库压力,但是由于时间问题,对平台的订单进行全面替换难度很大而且不稳定,于是打算在原有的系统中添加多数据源,对数据进行双写,以减少迭代成本
本次项目架构
spring boot+Mybatis+oracle+mysql+pageHelper
实现目标
在项目中实现多数据源,并且可以在同一次请求中进行切换,将insert、update、delete操作在oracle和mysql两个库执行,对客和统计用的select语句可以继续在旧库上应用,等待迭代
####步骤说明
数据源定义
首先定义两个数据源,分别来自mysql和oracle,使项目可以获取多数据源的连接信息
mysql数据源配置
1 |
|
oracle数据源配置
1 |
|
定义数据源枚举
1 |
|
定义ThreadLocal,用于指定线程中应该使用的数据源
1 | public class DataSourceType { |
自定义注解,指定为方法级注解,在方法上声明指定的数据源
1 | ({ElementType.METHOD}) |
自定义aop拦截切面,拦截有指定注解的方法,解析注解中指定的数据源并通过ThreadLocal进行设置和清除
1 |
|
实现spring的动态数据源接口AbstractRoutingDataSource
1 | public class DynamicDataSource extends AbstractRoutingDataSource { |
把AbstractRoutingDataSource交给IOC容器管理
1 |
|
springBoot配置,提供druid连接池配置和数据源信息配置
用<>符号标注了常用的修改项
1 | spring: |
pagehelper分页工具配置,
1 | pagehelper: |
到这里就完成了所有的更改,在代码编写中,通过aop环绕增强,如果不在service级别指定数据源,则使用mysql数据源,如果指定是oracle则使用oracle数据源,通过ThreadLocal进行保存,spring的AbstractRoutingDataSource会帮我们获取保存在线程变量中的数据源并设置到本次Mybatis的查询sqlSession中,配合Mybatis的分页插件pageHelper自带的动态数据源切换自动修改分页方言功能,完成了项目里sql执行和自动分页功能,已经基本完成了使用需求。