使用sharing-jdbc进行分表查询

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

如何分表

1、垂直分表

将冷热数据分离,将常用数据和非常用数据进行分开存储。将不常用的大字段进行分表存储。

2、水平分表

将表中不同的数据行按照一定规律分布到不同的数据库表中。

可以使用求余的方式,也可以使用hash的方式。

使用sharing-jdbc进行分表后的查询

首先引入依赖

        
            com.dangdang
            sharding-jdbc-core
            1.4.2
        
        
            com.dangdang
            sharding-jdbc-config-spring
            1.4.0
        

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



                
    配置分表规则器  sharding-columns:分表规则依赖的名(根据user_id取模分表),algorithm-class:分表规则的实现类 
    
    
        这里填写关联数据源(多个数据源用逗号隔开),
            
                
                 
logic-table:逻辑表名(mybatis中代替的表名)actual-tables:数据库实际的表名,这里支持inline表达式,比如:member_index_tbl_${0..2}会解析成member_index_tbl_0,member_index_tbl_1,member_index_tbl_2;member_index_tbl_${[a,b,c]}会被解析成member_index_tbl_a,member_index_tbl_b和member_index_tbl_c,两种表达式一起使用的时候,会采取笛卡尔积的方式:member_index_tbl_${[a,b]}${0..2}解析为member_index_tbl_a0,member_index_tbl_a1,member_index_tbl_a2,member_index_tbl_b0,member_index_tbl_b1,member_index_tbl_b2;table-strategy:前面定义的分表规则器;
            
        
    
    
    
        
    

配置好改文件后,需要修改之前我们的spring-dataSource的几个地方,把sqlSessionFactory和transactionManager原来关联的dataSource统一修改为shardingDataSource(这一步作用就是把数据源全部托管给sharding去管理)

1140944-20170425141731006-390893009.png

1140944-20170425142050365-891428347.png

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

/**
 * 分表逻辑
 * @author zhangwentao
 *
 */
public class MemberSingleKeyTableShardingAlgorithm implements SingleKeyTableShardingAlgorithm {
    
    /**
     * sql between 规则
     */
    public Collection doBetweenSharding(Collection tableNames, ShardingValue shardingValue) {
        Collection result = new LinkedHashSet(tableNames.size());
        Range range = (Range) shardingValue.getValueRange();
        for (long i = range.lowerEndpoint(); i <= range.upperEndpoint(); i++) {
            Long modValue = i % 100;
            String modStr = modValue < 10 ? "0" + modValue : modValue.toString();
            for (String each : tableNames) {
                if (each.endsWith(modStr)) {
                    result.add(each);
                }
            }
        }
        return result;
    }

    /**
     * sql == 规则
     */
    public String doEqualSharding(Collection tableNames, ShardingValue shardingValue) {
        Long modValue = shardingValue.getValue() % 100;
        String modStr = modValue < 10 ? "0" + modValue : modValue.toString();
        for (String each : tableNames) {
            if (each.endsWith(modStr)) {
                return each;
            }
        }
        throw new IllegalArgumentException();
    }

    /**
     * sql in 规则
     */
    public Collection doInSharding(Collection tableNames, ShardingValue shardingValue) {

        Collection result = new LinkedHashSet(tableNames.size());
        for (long value : shardingValue.getValues()) {
            Long modValue = value % 100;
            String modStr = modValue < 10 ? "0" + modValue : modValue.toString();
            for (String tableName : tableNames) {
                if (tableName.endsWith(modStr)) {
                    result.add(tableName);
                }
            }
        }
        return result;
    }
    
}

以上四步,我们就完成了sharding-jdbc的搭建,我们可以写一个测试demo来检查我们的成果

    

 

转载于:https://my.oschina.net/u/1175305/blog/1799054

你可能感兴趣的:(使用sharing-jdbc进行分表查询)