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

sharding-jdbc分库分表之解析yaml配置文件

阅读更多

一、简述

    sharding-jdbc是一个jdbc的中间件,对jdbc进行了一些封装来实现了分库分表的功能。一般分库分表我们只需要把数据源封装一下就可以了,然后不管是用hibernate或者是mybaties只要把数据源赋过去就可以了,具体的数据入哪一个数据库,哪一张数据表,则是通过中间件的分库分表策略来实现的。

    sharding-jdbc可以通过多种方式来配置分库分表策略,这次只简单地说一下通过yaml文件来配置 分库分表策略。

 

二、通过snakeyaml来解析yam文件

      先来一个简单地例子

 

 public void load() throws FileNotFoundException{
        //初始化Yaml解析器
        Yaml yaml = new Yaml();
        File f=new 
File("test.yaml");
        //读入文件
        Object result= yaml.load(new FileInputStream(f));
        System.out.println(result.getClass());
        System.out.println( result);
    }
----test.yaml---
a: 1
b: 2
----输出---
class java.util.LinkedHashMap
{a=1, b=2}

 这里就是初始化一个解析器,当然这个解析器也可以传参数,具体可以传入的参数有以下四种:

 

 

constructor

用于配置构造对象的创建过程

representer

用于配置yaml文件中对应tag响应解析成的对象
Representer representer = new Representer();
representer.addClassTag(Car.class, new Tag("!car"));//这里!car就会使用Car类型来解析,而不需要再配置文件中写全car的包名
representer.addClassTag(Wheel.class, Tag.MAP);//会使用Wheel对map的类型进行解析

dumpoption

这个是在dump时,控制输出的宽度,对齐,类类型等相关信息

resolver

用于隐式识别对应类型,只要符合了对应的pattern就会使用对应的tag进行解析
yaml.addImplicitResolver(new Tag("!dice"), Pattern.compile("\d+d\d+"), "123456789");

 

而对于load方法也有多种方式,可以支持string,reader等参数外,也可以使用loadAs来讲文件解析成相对应的对象

 

sharding-jdbc对数据源分配策略的yaml文件配置好了自己的bean,也就是ShardingRuleConfig这个类,那么,我们解析yaml文件的时候只需要:

 

new Yaml().loadAs(new Reader(file ) , ShardingRuleConfig.class) ;

 如果需要对解析过程进行一些操作,则可以新建一个继承Constructor 的类传入到yaml的构造方法中。如下

public class YamlShardingConstructor extends Constructor {

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

    /**
     * YAML解析插入自定义逻辑
     */
    private class MyConstructScalar extends ConstructScalar {
        public Object construct(Node node) {
            if (node instanceof ScalarNode) {
               do something and  return ; 
            }
            return super.construct(node);
        }
    }

}

 然后解析的时候可以 new yaml(new YamlShardingConstructor()).loadAs(new Reader(file ),ShardingRuleConfig.class);

 

因为sharding-jdbc配置数据源分配策略是可能会配置一些properties,比如show-sql等,这样就需要在ShardingRuleConfig中加入一个properties变量来存放这些属性,可以新建一个类继承ShardingRuleConfig,新增属性Properties ,并添加getter和setter方法,然后loadaas方法中则传入新建的类的class对象即可

可以贴一个分库分表策略的yaml配置文件:

 

 dataSource:

  #配置库

  shard-db0: !!com.alibaba.druid.pool.DruidDataSource

    driverClassName: com.mysql.jdbc.Driver

    url: jdbc:mysql://localhost:3307/database0?characterEncoding=UTF-8&useUnicode=true&autoReconnect=true&verifyServerCertificate=${{jdbc.verifyServerCertificate}}&useSSL=${{jdbc.useSSL}}&trustCertificateKeyStoreUrl=${{jdbc.trustCertificateKeyStoreUrl}}&trustCertificateKeyStorePassword=${{jdbc.trustCertificateKeyStorePassword}}&clientCertificateKeyStoreUrl=${{jdbc.clientCertificateKeyStoreUrl}}&clientCertificateKeyStorePassword=${{jdbc.clientCertificateKeyStorePassword}}

    username: ${{jdbc.username}}

    password: ${{jdbc.password}}

  #

  shard-db1: !!com.alibaba.druid.pool.DruidDataSource

    driverClassName: com.mysql.jdbc.Driver

    url: jdbc:mysql://localhost:3307/database1?characterEncoding=UTF-8&useUnicode=true&autoReconnect=true&verifyServerCertificate=${{jdbc.verifyServerCertificate}}&useSSL=${{jdbc.useSSL}}&trustCertificateKeyStoreUrl=${{jdbc.trustCertificateKeyStoreUrl}}&trustCertificateKeyStorePassword=${{jdbc.trustCertificateKeyStorePassword}}&clientCertificateKeyStoreUrl=${{jdbc.clientCertificateKeyStoreUrl}}&clientCertificateKeyStorePassword=${{jdbc.clientCertificateKeyStorePassword}}

    username: ${{jdbc.username}}

    password: ${{jdbc.password}}

 

 

defaultDataSourceName: shard-db0

 

分表策略

tables:

 

  #设备性能数据表

  user_table:

    dynamic: true

    dataSourceNames: shard-db1

    databaseStrategy: &db_raw

      shardingColumns: id,bornYear

      algorithmClassName: com.xxx.sharding.algorithm.GroupIDAndCollectTimeDBShardingAlgorithm

    tableStrategy: &tb_raw

      shardingColumns: collect_time

      algorithmClassName: com.xxx.sharding.algorithm.CollectTimeYYYYMMDDTBShardingAlgorithm

 

  iems_inverter_hoursehold_t:

    dynamic: true

    dataSourceNames: shard-db1

    databaseStrategy: *db_raw

    tableStrategy: *tb_raw

 

  iems_inverter_center_t:

    dynamic: true

    dataSourceNames: shard-db1

    databaseStrategy: *db_raw

    tableStrategy: *tb_raw

 

  iems_meter_t:

    dynamic: true

    dataSourceNames: shard-db1

    databaseStrategy: *db_raw

    tableStrategy: *tb_raw

  

props:

  sql.show: true

 

 其中.GroupIDAndCollectTimeDBShardingAlgorithm 分库策略和分表策略CollectTimeYYYYMMDDTBShardingAlgorithm后面说明,当然algorithmClassName也可以用algorithmExpression来指定入库的表名(这里的表名肯定不是固定的,比如table_${db-id})

 

分享到:
评论

相关推荐

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

    这个"mysql分库分表sharding-jdbc-sharding-jdbc-demo.zip"压缩包提供的就是一个使用Sharding-JDBC进行数据库分库分表的示例项目。 Sharding-JDBC的工作原理是通过透明化的JDBC层,将数据路由、分片规则、读写分离...

    sharding-jdbc分表分库接口版、配置版

    标题"sharding-jdbc分表分库接口版、配置版"提到了"sharding-jdbc",这是一个开源的Java框架,用于解决大数据量下的数据库分库分表问题。"接口版"可能指的是通过API来操作数据库,而"配置版"可能指的是通过配置文件...

    Sharding-JDBC实现读写分离demo

    Sharding-JDBC是阿里巴巴开源的一款轻量级Java框架,主要用于解决大数据量场景下的数据库分库分表问题,同时也支持读写分离,以提高系统的并发处理能力和数据存储能力。在这个“Sharding-JDBC实现读写分离demo”中,...

    MySQL分库分表演示-sharding-jdbc-demo.zip

    在这个名为"MySQL分库分表演示-sharding-jdbc-demo"的项目中,我们将学习如何使用Sharding-JDBC来实现数据库的分库分表。首先,我们需要了解Sharding-JDBC的核心概念: 1. **分片规则**:定义了数据如何被分片到...

    sharding-proxy实现分表

    分库分表是数据库水平扩展的一种常见策略,用于解决单表数据量过大导致的性能问题。随着业务的增长,数据量可能会急剧增加,单个数据库无法高效处理,这时就需要将数据分散到多个数据库或表中,以降低单表的数据量,...

    分库分表实战Spring Boot2+Sharding-JDBC视频教程-课课家教育.docx

    4. **YAML配置方式**:Sharding-JDBC支持使用YAML文件进行配置,学习者将了解到如何通过YAML文件设置数据库连接信息、分片策略等,以实现更加简洁的配置管理。 5. **SpringBoot集成Sharding-JDBC**:SpringBoot的...

    分库分表,多数据源的切换

    例如,我们可以根据业务模块或者用户ID进行分库分表,然后在需要执行SQL的地方,Sharding-JDBC会自动将SQL解析并路由到正确的数据库和表。 通过SSMDemo这个示例项目,我们可以深入了解Sharding-JDBC的使用方法。该...

    基于mybatis-plus+sharding+mysql的分库分表项目源码.zip

    1. **配置文件**:如application.properties或yaml,用于设置数据库连接信息、Sharding策略等。 2. **Sharding规则**:定义分片策略,包括分片键、分片算法等。 3. **Mybatis-Plus配置**:配置数据源、Mapper文件...

    shardingsphere 分库分表中文帮助文档

    - 数据库横向扩展场景:当单个数据库无法承载大量数据时,可以使用 Shardingsphere-JDBC 进行分库分表操作。 - 复杂查询优化:通过路由规则配置,可以优化跨库、跨表的复杂 SQL 查询。 ##### 1.1.2 ...

    shardingsphere_docs_cn.pdf

    本文主要关注其在分库分表、读写分离、分布式主键生成和事务支持等方面的应用,以及如何通过Sharding-JDBC进行配置。 1. **数据分片** 数据分片是ShardingSphere的主要特性之一,它允许用户根据业务需求将大型...

    springMvc Mybatis mysql 分库分表-shardingJdbc.zip

    Spring MVC、MyBatis和MySQL是常见的Web开发框架与数据库系统,而ShardingJDBC则是阿里巴巴开源的一款分布式数据库中间件,用于实现数据库的分库分表。本项目结合了这些技术,旨在提供一种高效且可扩展的解决方案。 ...

    java分区分表项目

    在本项目"java分区分表项目"中,我们重点研究了Sharding-JDBC,这是一个轻量级的Java库,可以在不改变任何数据库基础设施的情况下实现数据分片。该项目名为"sharding-jdbc-sample-master",提供了实战演练的示例代码...

    sharding-sphere-demo-master.zip

    2. **ShardingSphere**:开源的分布式数据库中间件,包括ShardingJDBC、ShardingProxy和Sidecar等组件,支持数据库水平扩展、读写分离、分库分表等功能。 3. **ShardingJDBC**:作为Java的JDBC驱动,可在现有的业务...

    incubator-shardingsphere-example-dev_currenthfw_分库分表_源码

    这可以通过Java代码、XML配置文件或者YAML配置文件实现。 3. 数据源配置:定义数据库连接信息,包括数据库地址、用户名、密码等。 4. SQL解析:ShardingSphere会解析SQL语句,识别出分片键并应用分片策略。 5. ...

    ShardingSphere实战场景&与Atlas和Mycat对比(1)预习1

    2. **大数据量场景**:对于具有海量数据的应用,如日志分析系统、用户行为分析平台等,需要通过分库分表来优化查询性能和存储效率。 3. **混合事务和分析处理(HTAP)**:ShardingSphere 支持在同一个应用中同时处理...

Global site tag (gtag.js) - Google Analytics