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后面说明

 

猜你喜欢

转载自dwj147258.iteye.com/blog/2422362