基于Spring的分库实践

2017-02-04  本文已影响0人  北海三少

介绍

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

环境说明

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

实践步骤

1、数据源配置

1)公共数据源配置

公共数据源配置

2)数据源1配置

数据源1配置

3)数据源2配置

数据源2配置

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

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

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

2、重写AbstractRoutingDataSource的determineCurrentLookupKey方法

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

重写determineCurrentLookupKey方法

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

ShardingContextHolder类源码

3、Mybatis的配置

1)定义会话工厂

会话工厂配置

dataSource属性引用shardingRoutingDs。

2)配置事务管理器

配置事务管理器

dataSource属性引用shardingRoutingDs。

3)Mapper接口包扫描配置

Mapper接口包扫描配置

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

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

切面类源码

配置切面类的拦截规则

AOP拦截规则

DataSourceConfig类保存数据源的key值

DataSourceConfig类源码

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

DataSourceConfig类配置

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

ShardingRouter类源码

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

ShardingAlgorithm接口的实现类源码

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

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

上一篇下一篇

猜你喜欢

热点阅读