欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

sharding-sphere 3.1.0 的简单使用

程序员文章站 2022-06-13 17:21:17
最开始倒腾sharding-sphere的时候,在网上找了半天,下了源码看了半天(想用@Configuration 注解的方式,而不是去写配置文件,我觉得配置文件太多了,弄的晃眼),也没有弄明白个所以然。 后面直接在官网找到了比较齐全的答案,我最开始还以为必须要配置配置文件啥的,其实完全不需要。 这 ......

最开始倒腾sharding-sphere的时候,在网上找了半天,下了源码看了半天(想用@configuration 注解的方式,而不是去写配置文件,我觉得配置文件太多了,弄的晃眼),也没有弄明白个所以然。

后面直接在官网找到了比较齐全的答案,我最开始还以为必须要配置配置文件啥的,其实完全不需要。

这个是官网地址:

下面这个是我们系统的一些配置:由于我们系统小,所以只用到了分表,没有用到分库和分片和主从,但是配置这些也很容易。

import java.sql.sqlexception;
import java.util.hashmap;
import java.util.map;
import java.util.properties;
import java.util.concurrent.concurrenthashmap;

import javax.sql.datasource;

import org.springframework.beans.factory.annotation.autowired;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import org.springframework.context.annotation.primary;

import com.oftoo.datasource.config.dynamicdatasource;
import com.oftoo.datasource.database.ipkeygenerator;
import com.oftoo.datasource.database.timeshardingtablealgorithm;

import io.shardingsphere.api.config.rule.shardingruleconfiguration;
import io.shardingsphere.api.config.rule.tableruleconfiguration;
import io.shardingsphere.api.config.strategy.standardshardingstrategyconfiguration;
import io.shardingsphere.shardingjdbc.api.shardingdatasourcefactory;

@configuration
public class datasourceconfig {

    @autowired
    dynamicdatasource datasource;

    @bean(name = "shardingdatasource")
    @primary
    datasource getshardingdatasource() throws sqlexception {
        shardingruleconfiguration shardingruleconfig = new shardingruleconfiguration();
        shardingruleconfig.gettableruleconfigs().add(gettesttableruleconfiguration()); // 如果有多个表,可以用逗号“,”分隔 ,比如user_info,
        //shardingruleconfig.gettableruleconfigs().add(getterminalrecordtableruleconfiguration());
        shardingruleconfig.getbindingtablegroups().add("tb_user,t_terminal_record");
        // 设置分片策略,自定义算法来实现分片规则 //shardingruleconfig.setdefaultdatabaseshardingstrategyconfig(new
        // standardshardingstrategyconfiguration("user_id", new demodatabaseshardingalgorithm()));
        shardingruleconfig.setdefaulttableshardingstrategyconfig(//
                new standardshardingstrategyconfiguration("user_id", new timeshardingtablealgorithm()));

        return shardingdatasourcefactory.createdatasource(createdatasourcemap(), shardingruleconfig, //
                new concurrenthashmap(), new properties());
    }

    /**
     * 配置表规则
     * 
     * @return
     */
    tableruleconfiguration gettesttableruleconfiguration() {
        tableruleconfiguration test = new tableruleconfiguration(); // 配置表名
        test.setlogictable("tb_user"); // 配置真实的数据节点,即数据库中真实存在的节点,由数据源名 + 表名组成
        test.setactualdatanodes("ds_0.tb_user_${0..1}");// user_${0..1}分库,user_info_${0..1}分表
        // 主键生成列,默认的主键生成算法是snowflake
        test.setkeygeneratorcolumnname("user_id");
        ipkeygenerator.initworkerid();
        return test;
    }

    /**
     * 创建数据源
     * 
     * @return
     */
    private map<string, datasource> createdatasourcemap() {
        map<string, datasource> result = new hashmap<>();
        result.put("ds_0", datasource);
        return result;
    }


}

maven:

        <dependency>
            <groupid>io.shardingsphere</groupid>
            <artifactid>sharding-jdbc-core</artifactid>
            <version>3.1.0</version>
        </dependency>

timeshardingtablealgorithm这个类我复制的另外一个人写的,

paraseshardingkeytool.getyearandmonth(shardingvalue.getvalue())这个只是获取到了日期如:201808(这个就是表名)
import java.util.collection;

import com.oftoo.common.utils.paraseshardingkeytool;

import io.shardingsphere.api.algorithm.sharding.preciseshardingvalue;
import io.shardingsphere.api.algorithm.sharding.standard.preciseshardingalgorithm;

public class timeshardingtablealgorithm implements preciseshardingalgorithm<long> {
    @override
    public string dosharding(collection<string> availabletargetnames, preciseshardingvalue<long> shardingvalue) {
        stringbuffer tablename = new stringbuffer();
        tablename.append(shardingvalue.getlogictablename()).append("_").append(paraseshardingkeytool.getyearandmonth(shardingvalue.getvalue()));

        return tablename.tostring();
    }
}

sharding-sphere 3.1.0 的简单使用这个是我数据库的表名,里面的字段很简单,就一个user_id 和name,我们这边用的是spring +mybatis 。