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

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

程序员文章站 2022-06-10 21:53:06
...

一、简述

    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})

 

相关标签: yaml sharding-jdbc