美文网首页
基于Spring的分库实践

基于Spring的分库实践

作者: 北海三少 | 来源:发表于2017-02-04 14:58 被阅读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的拦截规则和分库算法。

    相关文章

      网友评论

          本文标题:基于Spring的分库实践

          本文链接:https://www.haomeiwen.com/subject/ghejittx.html