基于Spring的分库实践

介绍

本文是运用Spring的AbstractRoutingDataSource在应用程序中进行动态数据源的切换,以达到分库的目的。AbstractRoutingDataSource抽象类是一个具有路由功能的DataSource类,可以在运行时,根据设定的key值动态切换到真正的DataSource。

环境说明

Spring+Mybatis+Mysql+Druid(JDBC连接池),2个Mysql数据库实例

实践步骤

1、数据源配置

1)公共数据源配置

基于Spring的分库实践_第1张图片
公共数据源配置

2)数据源1配置

基于Spring的分库实践_第2张图片
数据源1配置

3)数据源2配置

基于Spring的分库实践_第3张图片
数据源2配置

4)具有路由功能的数据源配置

基于Spring的分库实践_第4张图片
具有路由功能的数据源配置

ShardingRoutingDataSource继承自AbstractRoutingDataSource,重写determineCurrentLookupKey方法,实现动态数据源的切换,shardingRoutingDs中引用真正的数据源dataSource1和dataSource2。

2、重写AbstractRoutingDataSource的determineCurrentLookupKey方法

定义类ShardingRoutingDataSource,继承AbstractRoutingDataSource,重写determineCurrentLookupKey方法

基于Spring的分库实践_第5张图片
重写determineCurrentLookupKey方法

ShardingContextHolder是通过线程局部变量保存数据源的key值

基于Spring的分库实践_第6张图片
ShardingContextHolder类源码

3、Mybatis的配置

1)定义会话工厂

基于Spring的分库实践_第7张图片
会话工厂配置

dataSource属性引用shardingRoutingDs。

2)配置事务管理器

配置事务管理器

dataSource属性引用shardingRoutingDs。

3)Mapper接口包扫描配置

Mapper接口包扫描配置

4、通过AOP拦截需要进行数据源切换的方法

定义一个切面类,在方法中获取拦截方法的参数,并根据一定的规则,使用某个参数的值计算数据源对应的key值,并把这个key值保存到线程局部变量中。比如:数据平均分布到不同的库,可以使用主键ID的值对数据库总数进行求余取模,ID%数据库个数,计算出一个值,通过这个值去索引数据源配置的key值。

基于Spring的分库实践_第8张图片
切面类源码

配置切面类的拦截规则

AOP拦截规则

DataSourceConfig类保存数据源的key值

基于Spring的分库实践_第9张图片
DataSourceConfig类源码

DataSourceConfig类配置,配置的key值和ShardingRoutingDataSource的配置对应

基于Spring的分库实践_第10张图片
DataSourceConfig类配置

ShardingRouter类,实现数据源key值的动态切换功能。doRoute方法有2个参数,第一个参数保存了需要使用的分库因子,如:ID的值,数据库个数,第二个参数是分库的算法名称,可以根据定义不同的分库算法。

基于Spring的分库实践_第11张图片
ShardingRouter类源码

ShardingAlgorithm接口,用于计算数据源的索引

基于Spring的分库实践_第12张图片
ShardingAlgorithm接口的实现类源码

AverageShardingAlgorithm类,平均分布数据到各个数据库。

通过Spring的AbstractRoutingDataSource可以实现数据源的动态切换,以达到分库的目的,可以根据业务需要配置AOP的拦截规则和分库算法。

你可能感兴趣的:(基于Spring的分库实践)