zoukankan      html  css  js  c++  java
  • 利用Sharding-Jdbc实现分表

    闲来无事,喜欢研究一些自己未接触过的技术~

    看到了当当开源的Sharding-JDBC组件,它可以在几乎不修改代码的情况下完成分库分表的实现。摘抄其中一段介绍:

          Sharding-JDBC直接封装JDBC API,可以理解为增强版的JDBC驱动,旧代码迁移成本几乎为零:

    • 可适用于任何基于java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC

    • 可基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid等。

    • 理论上可支持任意实现JDBC规范的数据库。虽然目前仅支持MySQL,但已有支持Oracle,SQLServer,DB2等数据库的计划。

    先做一个最简单的试用,不做分库,仅做分表。选择数据表bead_information,首先复制成三个表:bead_information_0、bead_information_1、bead_information_2

    测试实现过程

     前提:已经实现srping+mybatis对单库单表做增删改查的项目。

     1、修改pom.xml增加dependency

            <dependency>
                <groupId>com.dangdang</groupId>
                <artifactId>sharding-jdbc-core</artifactId>
                <version>1.4.2</version>
            </dependency>
            <dependency>
                <groupId>com.dangdang</groupId>
                <artifactId>sharding-jdbc-config-spring</artifactId>
                <version>1.4.0</version>
            </dependency>    

    2、新建一个sharding-jdbc.xml文件,实现分库分表的配置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context" 
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:rdb="http://www.dangdang.com/schema/ddframe/rdb"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans.xsd 
                            http://www.springframework.org/schema/tx 
                            http://www.springframework.org/schema/tx/spring-tx.xsd
                            http://www.springframework.org/schema/context 
                            http://www.springframework.org/schema/context/spring-context.xsd
                            http://www.dangdang.com/schema/ddframe/rdb 
                            http://www.dangdang.com/schema/ddframe/rdb/rdb.xsd">
        
     
        
         <!-- 配置数据源 -->
        <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
            <property name="url" value="jdbc:mysql://localhost:3306/beadhouse" />
            <property name="username" value="root" />
            <property name="password" value="123456" />
        </bean>
                     
        <rdb:strategy id="tableShardingStrategy" sharding-columns="id" algorithm-class="com.springdemo.utill.MemberSingleKeyTableShardingAlgorithm"/>
        
        <rdb:data-source id="shardingDataSource">
            <rdb:sharding-rule data-sources="dataSource">
                <rdb:table-rules>
                    <rdb:table-rule logic-table="bead_information" actual-tables="bead_information_${0..2}"  table-strategy="tableShardingStrategy"/>
                </rdb:table-rules>
            </rdb:sharding-rule>
        </rdb:data-source>
        
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="shardingDataSource" />
        </bean>
    </beans>

    3、将文件引入spring配置文件中。

          需要修改几个地方,把sqlSessionFactory和transactionManager原来关联的dataSource统一修改为shardingDataSource(这一步作用就是把数据源全部托管给sharding去管理)

    4、实现分表(分库)逻辑,我们的分表逻辑类需要实现SingleKeyTableShardingAlgorithm接口的三个方法doBetweenSharding、doEqualSharding、doInSharding

    (取模除数需要按照自己需求改变,我这里分3个表,所以除以3)

    import java.util.Collection;
    import java.util.LinkedHashSet;
    import com.dangdang.ddframe.rdb.sharding.api.ShardingValue;
    import com.dangdang.ddframe.rdb.sharding.api.strategy.table.SingleKeyTableShardingAlgorithm;
    import com.google.common.collect.Range;
    public class MemberSingleKeyTableShardingAlgorithm implements SingleKeyTableShardingAlgorithm<Integer> {
    
        @Override
        public Collection<String> doBetweenSharding(Collection<String> tableNames, ShardingValue<Integer> shardingValue) {
            Collection<String> result = new LinkedHashSet<String>(tableNames.size());
            Range<Integer> range = (Range<Integer>) shardingValue.getValueRange();
            for (Integer i = range.lowerEndpoint(); i <= range.upperEndpoint(); i++) {
                Integer modValue = i % 3;
                String modStr = modValue < 3 ? "" + modValue : modValue.toString();
                for (String each : tableNames) {
                    if (each.endsWith(modStr)) {
                        result.add(each);
                    }
                }
            }
            return result;
        }
        @Override
        public String doEqualSharding(Collection<String> tableNames, ShardingValue<Integer> shardingValue) {
            Integer modValue = shardingValue.getValue() % 3;
            String modStr = modValue < 3 ? "" + modValue : modValue.toString();
            for (String each : tableNames) {
                if (each.endsWith(modStr)) {
                    return each;
                }
            }
            throw new IllegalArgumentException();
        }
        @Override
        public Collection<String> doInSharding(Collection<String> tableNames, ShardingValue<Integer> shardingValue) {
            Collection<String> result = new LinkedHashSet<String>(tableNames.size());
            for (Integer value : shardingValue.getValues()) {
                Integer modValue = value % 3;
                String modStr = modValue < 3 ? "" + modValue : modValue.toString();
                for (String tableName : tableNames) {
                    if (tableName.endsWith(modStr)) {
                        result.add(tableName);
                    }
                }
            }
            return result;
        }
    }

    5、配置完成,可以实现增删改查测试。

  • 相关阅读:
    CSS布局之浮动原理
    img中的alt和title的区别
    重绘+重排+项目优化
    事件冒泡、事件捕获和事件委托
    js数组方法总结
    flex布局
    冒泡排序
    函数节流和函数防抖
    从一个url地址最终到页面渲染完成,发生了什么
    如何让网站变灰
  • 原文地址:https://www.cnblogs.com/huangheng01/p/9366325.html
Copyright © 2011-2022 走看看