`
dwj147258
  • 浏览: 195778 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

sharding-jdbc分片策略(二)

 
阅读更多

一、在最开始提到了GroupIDAndCollectTimeDBShardingAlgorithm分库策略和CollectTimeYYYYMMDDTBShardingAlgorithm分表策略

这两个分别实现的是MultipleKeysDatabaseShardingAlgorithm实现了dosharding方法

CollectTimeYYYYMMDDTBShardingAlgorithm实现了SingleKeyTableShardingAlgorithm中的

 doEqualSharding ,doInSharding , doBetweenSharding三个方法分别匹配sql语句中的 = , in , between

具体的实现就不写了,因为分片策略不同的场景有着不同的策略,理解了自然就通了。

 

综合以上讲解:实现sharding-jdbc数据源可以分为以下流程

一、写好配置文件

    ①包括制定数据源的类,有可能是自己实现的数据源

public class SwitchableDruidDataSource extends DruidDataSource {

	private static final Logger log = LoggerFactory.getLogger(SwitchableDruidDataSource.class);
    private static int maxRetryTimes = 20;
    private static int retryInterval = 10 * 1000;

    @Override
    public Connection createPhysicalConnection() throws SQLException {
        if (!Boolean.valueOf(EmpfLocalConfigure.getValue("jdbc.ssl.switchable"))) {
            return super.createPhysicalConnection();
        }
        int retryCounter = 0;
        while (retryCounter < maxRetryTimes) {
            try {
                return super.createPhysicalConnection();
            } catch (Exception ex) {
            	log.error("createPhysicalConnection error, ", ex);
                try {
                    Thread.sleep(retryInterval);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                    LoggerFactory.getLogger(DruidDataSource.class).info("retry with url[{}] => ", retryCounter, this.getUrl());
                }
                retryCounter++;
                switchSSL();
                if (retryCounter >= maxRetryTimes) {
                    return super.createPhysicalConnection();
                }
            }
        }
        return null;
    }

    private void switchSSL() {
        if (StringUtils.indexOf(getUrl(), "useSSL=true") != -1) {
            this.setUrl(StringUtils.replace(getUrl(), "useSSL=true", "useSSL=false"));
            this.setUrl(StringUtils.replace(getUrl(), "verifyServerCertificate=true", "verifyServerCertificate=false"));
        } else if (StringUtils.indexOf(getUrl(), "useSSL=false") != -1) {
            this.setUrl(StringUtils.replace(getUrl(), "useSSL=false", "useSSL=true"));
            this.setUrl(StringUtils.replace(getUrl(), "verifyServerCertificate=false", "verifyServerCertificate=true"));
        }
    }

}

     ②写好数据源和逻辑表的分库分表策略:这个可参考前两篇文章

     二,写sharding 数据源,这个数据源要继承dangdang的shardingdatasource

public class YamlShardingDataSource extends com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource {

	private YamlConfig yamlConfig = null;

	public YamlShardingDataSource(final File yamlFile) throws IOException {
		// C_387386 NULL_RETURNS

		super(new ShardingRuleBuilder(yamlFile.getName(), unmarshal(yamlFile)).build(), null != unmarshal(yamlFile) ? unmarshal(yamlFile).getProps() : null);
		yamlConfig = unmarshal(yamlFile);
		LoggerFactory.getLogger(YamlShardingDataSource.class).debug("debug ==> " + yamlFile.getCanonicalPath());
	}

	private static YamlConfig unmarshal(final File yamlFile) throws IOException {
		try (FileInputStream fileInputStream = new FileInputStream(yamlFile);
				InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8")) {
			return new Yaml(new YamlShardingConstructor()).loadAs(inputStreamReader, YamlConfig.class);
		}
	}

	public YamlConfig getYamlConfig() {
		return yamlConfig;
	}
}

 其中YamlShardingConstructor:

package com.pinnet.sharding.datasource;

import com.pinnet.platform.common.configure.EmpfLocalConfigure;
import org.apache.commons.lang.StringUtils;
import org.yaml.snakeyaml.constructor.Constructor;
import org.yaml.snakeyaml.nodes.Node;
import org.yaml.snakeyaml.nodes.NodeId;
import org.yaml.snakeyaml.nodes.ScalarNode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class YamlShardingConstructor extends Constructor {

    //yaml规范已有${},此处使用${{}}做标记
    private static final Pattern placeHolderPattern = Pattern.compile("\\$\\{\\{([^}}]+)\\}\\}");

    public YamlShardingConstructor() {
        super(YamlConfig.class);
        yamlClassConstructors.put(NodeId.scalar, new EncryptedConstructScalar());
    }

    /**
     * YAML解析插入自定义逻辑
     */
    private class EncryptedConstructScalar extends ConstructScalar {
        public Object construct(Node node) {
            if (node instanceof ScalarNode) {
                String val = (String) constructScalar((ScalarNode) node);
                //【安全特性简述】如果yaml中有${{}},则用EmpfLocalConfigure中的值替换
                Matcher matcher = placeHolderPattern.matcher(val);
                boolean replace = false;
                while (matcher.find()) {
                    replace = true;
                    val = StringUtils.replace(val, matcher.group(0), EmpfLocalConfigure.getValue(matcher.group(1)));
                }
                if (replace) {
                    return val;
                }
            }
            return super.construct(node);
        }
    }

}

 yamlconifg

            

public class YamlConfig extends ShardingRuleConfig {

    private Properties props = new Properties();

    public Properties getProps() {
        return props;
    }

    public void setProps(Properties props) {
        this.props = props;
    }
}

 

 

分片策略详解可以查看:https://blog.csdn.net/wuliusir/article/details/51090189

                                        http://lalahei.iteye.com/blog/2326061

 

 

分享到:
评论

相关推荐

    集成sharding-jdbc实现分库分表.zip

    Sharding-JDBC通过规则配置,可以根据特定的分片策略(如取模、范围等)将数据分布到不同的数据库和表上,达到数据分散的效果。 3. **Sharding-JDBC的集成步骤** - 引入库:在项目中添加Sharding-JDBC的Maven或...

    当当开源sharding-jdbc-轻量级数据库分库分表中间件

    3. **分片策略多样化**:支持等号、between、in等多种分片条件,同时也支持多分片键,可以根据不同的业务需求灵活配置分片策略。 4. **强大的SQL解析能力**:除了基本的增删改查外,还支持复杂的SQL操作,例如聚合...

    sharding-jdbc-boot-demo.zip

    Sharding-JDBC支持基于业务规则的动态分片策略,可以根据特定字段的值自动将数据分布到不同的数据库或表中。 【压缩包子文件的文件名称列表】"sharding-jdbc-boot-demo-master" 暗示这是一个Git仓库的主分支,包含...

    springboot整合sharding-jdbc完整代码

    2. **配置ShardingRule**:在`application.properties`或`application.yml`中配置数据分片规则,包括分片策略(如按照日期、ID范围等)、分片键、数据源信息等。 3. **定义数据源**:配置数据源,可以是单个数据库...

    sharding-jdbc按月分表样例

    这个简单的demo包含了设置分片策略、配置Sharding-JDBC规则、以及实际的数据库操作,开发者可以根据自己的业务需求对其进行调整。 在【标签】"sharding-jdbc shariding-jd"中,虽然"sharinding-jd"可能是"sharding-...

    sharding-jdbc按月分表样例2

    7. **实战解析**:在“sharding-jdbc-demo”中,我们可以通过查看源码理解如何配置Sharding-JDBC、定义分片策略、编写业务代码来调用分片API以及测试分片功能是否正常工作。 通过学习这个示例,开发者可以了解到...

    该项目主要采用springboot2.x+sharding -spring-boot-sharding-jdbc.zip

    3. 分片策略调整:随着业务发展,可能需要动态调整分片策略,因此设计时要考虑其灵活性。 总结,SpringBoot2.x结合Sharding-JDBC为Java开发者提供了一种高效且易于实现的数据库分片方案,通过简单的配置和编码,...

    sharding-jdbc之——分库分表实例完整源码

    5. **实例源码分析**:源码中可能包含了Sharding-JDBC的启动配置、数据源配置、分片策略定义、SQL路由逻辑、以及MyBatis的相关配置。通过阅读源码,可以理解Sharding-JDBC是如何在实际应用中处理分库分表的SQL执行...

    sharding-jdbc-master.zip 附完整代码可供参考

    在使用Sharding-JDBC时,你需要配置分片规则,包括分片键(用于决定数据分布的字段)、分片策略(如取模分片、范围分片等)以及数据库和表的切分规则。例如,你可以基于用户ID进行取模分片,确保每个用户的数据只...

    sharding-jdbc.zip

    Sharding-JDBC支持基于范围、哈希等策略的分片规则。 3. **读写分离**:Sharding-JDBC允许设置主库和从库,自动路由读请求到从库,写请求到主库,以提高系统性能,减轻主库压力。 4. **Mybatis**:Mybatis是一个...

    sharding-jdbc开源分表框架整合mybatis-demo

    1. **配置Sharding-JDBC**: 首先,需要在项目的配置文件中设置Sharding-JDBC的规则,包括分片策略(例如按照日期、用户ID等进行分表)、数据库和表的别名等。 2. **MyBatis集成**: 在MyBatis的配置中,需要将数据源...

    sharding-jdbc-demo

    3. 创建Sharding-JDBC的配置类,定义分片策略,比如按照时间、ID等进行分片,并指定数据源。 4. 集成MyBatis,配置MyBatis的Mapper接口和XML映射文件,编写SQL语句。 5. 在SpringBoot启动类中,启用Sharding-JDBC和...

    mysql分库分表sharding-jdbc-sharding-jdbc-demo.zip

    1. **数据分片**:将一个大表分成多个小表,分布在不同的数据库或表空间中,每个分片都有独立的主键范围,通过分片策略将SQL语句路由到合适的分片上执行。 2. **分片策略**:定义如何将数据分配到不同的分片上。...

    Sharding-JDBC实现读写分离demo

    Sharding-JDBC作为一个客户端的透明化数据分片解决方案,它通过在应用程序与数据库之间添加一个JDBC驱动层,使得应用无需感知底层数据分片的具体细节,即可实现数据的分库分表以及读写分离。下面,我们逐步解析如何...

    sharding-jdbc-example

    Sharding-JDBC提供了多种数据分片策略,包括哈希分片、范围分片和精确分片。哈希分片基于数据的哈希值进行分配,适用于均匀分布的数据;范围分片根据数据的某个字段范围进行分片,适合有序增长的数据;精确分片则...

    轻量级当当数据库中间件Sharding-JDBC深度解析

    分片规则配置是Sharding-JDBC的核心,它定义了数据分片的策略。JDBC规范重写是指Sharding-JDBC在内部实现上,对JDBC规范进行了一些必要的调整,以适应分库分表的需求。SQL解析是指在SQL语句到达数据库之前,Sharding...

    4-Sharding-JDBC分库分表.pdf

    分库分表的概念、垂直拆分与水平拆分、分片策略和分片算法是Sharding-JDBC中核心的知识点,下面将对这些概念进行详细的解释。 ### 分库分表概念 分库分表是为了解决随着业务数据量的不断增长,单库单表模式面临的...

    spring+mybatis+sharding-jdbc

    然后定义分片策略,比如按照时间、用户ID等字段进行分库分表。接着,在MyBatis的Mapper接口中,使用Sharding-JDBC提供的注解或API指定SQL的分片条件。最后,通过Spring的IoC容器获取并使用这些组件进行数据库操作。 ...

    SpringBoot+Mybatis-Plus整合Sharding-JDBC5.1.1实现单库分表【全网最新】.doc

    - 如果确实需要支持跨表插入,则需要考虑更复杂的分片策略或使用其他工具(如ShardingSphere Proxy)。 #### 三、导入 Maven 依赖 为了搭建完整的开发环境,需要添加以下Maven依赖: ```xml &lt;!-- Spring Boot ...

    Spring Boot中整合Sharding-JDBC

    Sharding-JDBC提供了丰富的功能来应对这些挑战,如基于主键的分片策略、广播表、绑定表、自定义分片策略等。通过深入理解Sharding-JDBC的原理和使用方式,我们可以更好地利用这个工具提升系统的扩展性和性能。 最后...

Global site tag (gtag.js) - Google Analytics