springboot整合ShardingJDBC实战及主要概念解析

一、ShardingSphere概念

在这里插入图片描述

ShardingSphere包含三个重要的产品,ShardingJDBC、ShardingProxy和ShardingSidecar。其中sidecar是针对service mesh定位的一个分库分表插件,目前在规划中;ShardingJDBC是用来做客户端分库分表的产品;而ShardingProxy是用来做服务端分库分表的产品

1、ShardingJDBC

在这里插入图片描述

shardingJDBC定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。它使⽤客户端直连数据库,以 jar 包形式提供服务,⽆需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。ShardingJDBC对代码的入侵性比较大,并且sql书写的局限性也很大。

2、ShardingProxy

在这里插入图片描述

ShardingProxy定位为透明化的数据库代理端,提供封装了数据库⼆进制协议的服务端版本,⽤于完成对异构语⾔的⽀持。⽬前提供 MySQL 和 PostgreSQL 版本,它可以使⽤任何兼容 MySQL/PostgreSQL 协议的访问客⼾端。ShardingProxy是一个独立部署的服务,类似于MyCat。这意味着分片规则需要提前订好,灵活性降低了。

3、ShardingJDBC、ShardingProxy区别

在这里插入图片描述

很显然,ShardingJDBC只是客户端的一个工具包,可以理解为一个特殊的JDBC驱动包,所有分库分表逻辑均由业务方自己控制,所以他的功能相对灵活,支持的数据库也非常多,但是对业务侵入大,需要业务方自己定制所有的分库分表逻辑。

而ShardingProxy是一个独立部署的服务,对业务方无侵入,业务方可以像用一个普通的MySQL服务一样进行数据交互,基本上感觉不到后端分库分表逻辑的存在,但是这也意味着功能会比较固定,能够支持的数据库也比较少。这两者各有优劣。

一般情况下,如果如数据量非常大,可以选择如下处理方式
1、如果是关系性较强的热点数据量较大(这些数据最好存在mysql这些关系型数据库中),先从缓存技术着手降低对数据库的访问压力;不行可以考虑数据库读写分离策略;如果读写分离后数据库压力依然非常大,且业务数据持续增长无法估量,最后才考虑分库分表(分库分表后sql功能会大大削弱,能不用就不用)
2、如果是关系性较弱的其他数据量较大,可以采取另外的一些分布式存储产品。例如PostGreSQL、VoltDB甚至HBase、Hive、ES等这些大数据组件来存储

二、实战

代码gitee仓库地址:https://gitee.com/tuojihu/sharding-sphere-demo
代码资源地址:https://download.csdn.net/download/qq_38639813/86838262

代码说明

在这里插入图片描述

1、配置文件01到05对应了ShardingJDBC不同的使用方式,分别是分表、分库分表、广播表、绑定表、读写分离。使用时将文件内容覆盖到application.properties中便可。
2、sql中是表的创建语句,在对应的数据库中执行便可。数据库名字在配置文件里有
3、algorithm中对应的是配置文件中所需要的的算法类
4、结合测试用例和配置文件说明便可自行尝试,不再赘述
详情参考:https://blog.csdn.net/qq_43631716/article/details/120300608

读写分离配置后直接可以做到写主、读从。但是数据库间的主从同步还是得靠数据库本身的二进制文件

三、分片策略

分片策略既适用于表、也适用于库。使用时表和库的分片策略可以自由搭配,不见得必须一样。总之就一个前提:合理的设置分片键,尽可能在增删改查时别操作所有表

1、NoneShardingStrategy

不分片。这种严格来说不算是一种分片策略了。只是ShardingSphere也提供了这么一个配置。

2、InlineShardingStrategy

最基础的策略、只支持普通的查询和排序。写分片表达式就可

配置参数:

inline.shardingColumn :分片键
inline.algorithmExpression: 分片表达式

实现方式:

按照分片表达式来进行分片。

3、StandardShardingStrategy

可支持范围查询,但查询条件若不是分片键或没有查询条件,则查所有表。需要定制具体的分片算法类

配置参数:

standard.sharding-column :分片键
standard.precise-algorithm-class-name: 精确分片算法类名;
standard.range-algorithm-class-name :范围分片算法类名

实现方式:

shardingColumn指定分片算法。

preciseAlgorithmClassName 指向一个实现了io.shardingsphere.api.algorithm.sharding.standard.PreciseShardingAlgorithm接口的java类名,提供按照 = 或者 IN 逻辑的精确分片 示例:com.jihu.sharding.algorithm.MyPreciseShardingAlgorithm

rangeAlgorithmClassName 指向一个实现了 io.shardingsphere.api.algorithm.sharding.standard.RangeShardingAlgorithm接口的java类名,提供按照Between 条件进行的范围分片。示例:com.jihu.sharding.algorithm.MyRangeShardingAlgorithm

说明:

其中精确分片算法是必须提供的,而范围分片算法则是可选的。

4、ComplexShardingStrategy

支持范围查询,并支持多分片键的复杂分片策略,因为可以制定多个分片键,所以在条件查询时可以避免查所有表。但是因为指定了多分片键,而每个分片键计算后对应的库、表未必一样,所以程序很难确定出插入那个表,插入可能会报错。需要定制具体的分片算法类

配置参数:

complex.sharding-columns : 分片键(多个)
complex.algorithm-class-name : 分片算法实现类

实现方式:

shardingColumn指定多个分片列。

algorithmClassName指向一个实现了org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingAlgorithm接口的java类名。提供按照多个分片列进行综合分片的算法。示例:com.jihu.sharding.algorithm.MyComplexKeysShardingAlgorithm

5、HintShardingStrategy

操作时可以指定具体的库、表。无需分片键,只需定制具体的分片算法类

配置参数:

hint.algorithm-class-name: 分片算法实现类

实现方式:

algorithmClassName指向一个实现了org.apache.shardingsphere.api.sharding.hint.HintShardingAlgorithm接口的java类名。 示例:com.jihu.sharding.algorithm.MyHintShardingAlgorithm

在这个算法类中,同样是需要分片键的。而分片键的指定是通过HintManager.addDatabaseShardingValue方法(分库)和HintManager.addTableShardingValue(分表)来指定。

使用时要注意,这个分片键是线程隔离的,只在当前线程有效,所以通常建议使用之后立即关闭,或者用try资源方式打开。


参考文档:https://blog.csdn.net/qq_43631716/article/details/120300608

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Sharding-JDBC 是一款基于 JDBC数据库中间件,用于将一个大型数据库表拆分成多个小表存储在不同的数据库中。Spring Boot 是一个非常流行的 Java 开发框架,它提供了很多方便的功能,比如自动配置、自动装配等,使得开发过程变得更加简单。 要在 Spring Boot整合 Sharding-JDBC,需要完成以下几个步骤: 1. 引入 Sharding-JDBC 的依赖 在 pom.xml 文件中添加 Sharding-JDBC 和对应的数据库驱动的依赖: ``` <dependency> <groupId>io.shardingjdbc</groupId> <artifactId>sharding-jdbc-core</artifactId> <version>${sharding-jdbc.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> ``` 2. 配置 Sharding-JDBC 的数据源 在 application.yml(或 application.properties)文件中配置 Sharding-JDBC 的数据源。这里以 MySQL 数据库为例: ``` spring: datasource: driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource username: root password: 123456 url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false shardingsphere: datasource: names: ds0, ds1 ds0: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/test0?useUnicode=true&characterEncoding=utf8&useSSL=false username: root password: 123456 ds1: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf8&useSSL=false username: root password: 123456 sharding: tables: user_info: actualDataNodes: ds$->{0..1}.user_info$->{0..1} tableStrategy: standard: shardingColumn: id preciseAlgorithmClassName: io.shardingjdbc.core.api.algorithm.sharding.PreciseModuloShardingAlgorithm rangeAlgorithmClassName: io.shardingjdbc.core.api.algorithm.sharding.RangeModuloShardingAlgorithm ``` 其中,`datasource.names` 配置了数据源的名称,`datasource.ds0` 和 `datasource.ds1` 分别配置了两个数据库实例的连接信息。`sharding.tables` 配置了需要进行分片的表的信息,`actualDataNodes` 配置了分片后的数据节点,`tableStrategy` 配置了分片算法。 3. 配置 MyBatis 如果使用 MyBatis 作为 ORM 框架,需要在 MyBatis 的配置文件中配置 Sharding-JDBC 的插件和数据源: ``` <plugins> <plugin interceptor="io.shardingjdbc.spring.boot.masterslave.SpringBootMasterSlavePlugin"/> </plugins> <environments default="master_slave"> <environment id="master_slave"> <transactionManager type="JDBC"/> <dataSource type="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${spring.datasource.driver-class-name}"/> <property name="url" value="${spring.datasource.url}"/> <property name="username" value="${spring.datasource.username}"/> <property name="password" value="${spring.datasource.password}"/> </dataSource> </environment> </environments> ``` 4. 测试分片效果 完成以上步骤后,就可以启动应用程序并测试分片效果了。可以插入一些数据并进行查询,观察数据是否被正确地分配到了不同的数据库中。 以上是整合 Sharding-JDBCSpring Boot 的基本步骤。当然,在实际应用中还需要根据具体业务需求进行更加详细的配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一梦无痕bzy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值