一、简述
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"压缩包提供的就是一个使用Sharding-JDBC进行数据库分库分表的示例项目。 Sharding-JDBC的工作原理是通过透明化的JDBC层,将数据路由、分片规则、读写分离...
标题"sharding-jdbc分表分库接口版、配置版"提到了"sharding-jdbc",这是一个开源的Java框架,用于解决大数据量下的数据库分库分表问题。"接口版"可能指的是通过API来操作数据库,而"配置版"可能指的是通过配置文件...
Sharding-JDBC是阿里巴巴开源的一款轻量级Java框架,主要用于解决大数据量场景下的数据库分库分表问题,同时也支持读写分离,以提高系统的并发处理能力和数据存储能力。在这个“Sharding-JDBC实现读写分离demo”中,...
在这个名为"MySQL分库分表演示-sharding-jdbc-demo"的项目中,我们将学习如何使用Sharding-JDBC来实现数据库的分库分表。首先,我们需要了解Sharding-JDBC的核心概念: 1. **分片规则**:定义了数据如何被分片到...
分库分表是数据库水平扩展的一种常见策略,用于解决单表数据量过大导致的性能问题。随着业务的增长,数据量可能会急剧增加,单个数据库无法高效处理,这时就需要将数据分散到多个数据库或表中,以降低单表的数据量,...
4. **YAML配置方式**:Sharding-JDBC支持使用YAML文件进行配置,学习者将了解到如何通过YAML文件设置数据库连接信息、分片策略等,以实现更加简洁的配置管理。 5. **SpringBoot集成Sharding-JDBC**:SpringBoot的...
例如,我们可以根据业务模块或者用户ID进行分库分表,然后在需要执行SQL的地方,Sharding-JDBC会自动将SQL解析并路由到正确的数据库和表。 通过SSMDemo这个示例项目,我们可以深入了解Sharding-JDBC的使用方法。该...
1. **配置文件**:如application.properties或yaml,用于设置数据库连接信息、Sharding策略等。 2. **Sharding规则**:定义分片策略,包括分片键、分片算法等。 3. **Mybatis-Plus配置**:配置数据源、Mapper文件...
- 数据库横向扩展场景:当单个数据库无法承载大量数据时,可以使用 Shardingsphere-JDBC 进行分库分表操作。 - 复杂查询优化:通过路由规则配置,可以优化跨库、跨表的复杂 SQL 查询。 ##### 1.1.2 ...
本文主要关注其在分库分表、读写分离、分布式主键生成和事务支持等方面的应用,以及如何通过Sharding-JDBC进行配置。 1. **数据分片** 数据分片是ShardingSphere的主要特性之一,它允许用户根据业务需求将大型...
Spring MVC、MyBatis和MySQL是常见的Web开发框架与数据库系统,而ShardingJDBC则是阿里巴巴开源的一款分布式数据库中间件,用于实现数据库的分库分表。本项目结合了这些技术,旨在提供一种高效且可扩展的解决方案。 ...
在本项目"java分区分表项目"中,我们重点研究了Sharding-JDBC,这是一个轻量级的Java库,可以在不改变任何数据库基础设施的情况下实现数据分片。该项目名为"sharding-jdbc-sample-master",提供了实战演练的示例代码...
2. **ShardingSphere**:开源的分布式数据库中间件,包括ShardingJDBC、ShardingProxy和Sidecar等组件,支持数据库水平扩展、读写分离、分库分表等功能。 3. **ShardingJDBC**:作为Java的JDBC驱动,可在现有的业务...
这可以通过Java代码、XML配置文件或者YAML配置文件实现。 3. 数据源配置:定义数据库连接信息,包括数据库地址、用户名、密码等。 4. SQL解析:ShardingSphere会解析SQL语句,识别出分片键并应用分片策略。 5. ...
2. **大数据量场景**:对于具有海量数据的应用,如日志分析系统、用户行为分析平台等,需要通过分库分表来优化查询性能和存储效率。 3. **混合事务和分析处理(HTAP)**:ShardingSphere 支持在同一个应用中同时处理...