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})
上一篇: 我最喜欢的云 IDE 有哪些?