介绍
本文是运用Spring的AbstractRoutingDataSource在应用程序中进行动态数据源的切换,以达到分库的目的。AbstractRoutingDataSource抽象类是一个具有路由功能的DataSource类,可以在运行时,根据设定的key值动态切换到真正的DataSource。
环境说明
Spring+Mybatis+Mysql+Druid(JDBC连接池),2个Mysql数据库实例
实践步骤
1、数据源配置
1)公共数据源配置

2)数据源1配置

3)数据源2配置

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

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

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

3、Mybatis的配置
1)定义会话工厂

dataSource属性引用shardingRoutingDs。
2)配置事务管理器

dataSource属性引用shardingRoutingDs。
3)Mapper接口包扫描配置

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

配置切面类的拦截规则

DataSourceConfig类保存数据源的key值

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

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

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

AverageShardingAlgorithm类,平均分布数据到各个数据库。
通过Spring的AbstractRoutingDataSource可以实现数据源的动态切换,以达到分库的目的,可以根据业务需要配置AOP的拦截规则和分库算法。
网友评论