ShardingJDBC-5.0.0及4.0.0使用示例

2023-11-20 22:50

本文主要是介绍ShardingJDBC-5.0.0及4.0.0使用示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Sharding5.0.0使用示例icon-default.png?t=M0H8https://download.csdn.net/download/zhaoyanga14/78982040

前言:

官方文档在5.0.0之后,提供的示例越来越少了,所以在配置的时候,可能会有些磕绊,我先踩了一遍坑,把完整的使用示例贴出来,供大家参考。

本篇介绍ShardingJDBC-5.0.0和ShardingJDBC-4.0.0中表分片的使用示例,我用到的:SpringBooot+Druid+ShardingJDBC+MyBatisPlus,数据库是MySQL。

本示例,提供表的两种分片方式:

        ①按某纯数字字段的奇偶性进行分表。

        ②按某日期字段的年月进行分表。

先将建表语句贴出来:

-- 奇偶分片表
CREATE TABLE `course_1` (`cid` bigint(20) NOT NULL,`cname` varchar(50) DEFAULT NULL,`user_id` bigint(20) DEFAULT NULL,`cstatus` varchar(10) DEFAULT NULL,PRIMARY KEY (`cid`)
);
CREATE TABLE `course_2` (`cid` bigint(20) NOT NULL,`cname` varchar(50) DEFAULT NULL,`user_id` bigint(20) DEFAULT NULL,`cstatus` varchar(10) DEFAULT NULL,PRIMARY KEY (`cid`)
);-- 年月分片表
CREATE TABLE `user_action_log_202201` (`id` bigint(64) NOT NULL COMMENT '主键',`name` varchar(64) DEFAULT NULL COMMENT '用户姓名',`date` datetime DEFAULT NULL COMMENT '访问时间',`path` varchar(255) DEFAULT NULL COMMENT '用户访问的路径',PRIMARY KEY (`id`)
);
CREATE TABLE `user_action_log_202202` (`id` bigint(64) NOT NULL COMMENT '主键',`name` varchar(64) DEFAULT NULL COMMENT '用户姓名',`date` datetime DEFAULT NULL COMMENT '访问时间',`path` varchar(255) DEFAULT NULL COMMENT '用户访问的路径',PRIMARY KEY (`id`)
);

接下来,我主要讲5.0.0,而4.0.0我会贴出pom.xml、application.properties一带而过,请见谅。

就不从新建项目开始说起,因为有些人是要集成到现有项目里,所以这里直接干。

Sharding5.0.0

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>org.springblade</groupId><artifactId>useraction</artifactId><version>0.0.1-SNAPSHOT</version><name>useraction</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- 不要使用druid-spring-boot-starter,会提示缺少sqlTemplate --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.22</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.0.0</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.0</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

application.yml

# 萨丁5.0.0配置
spring:shardingsphere:# 启动萨丁enabled: true# 配置数据库,连接池、驱动等,ds1为自定义标识datasource:names: ds1ds1:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8username: rootpassword: ffffff# 配置分片策略和主键策略rules:sharding:# 定义主键算法,key-algorithm为自定义算法名,这里采用了雪花算法,并添加了机器码标识(666)key-generators:key-algorithm:# 算法类型,目前只有雪花type: SNOWFLAKE# 算法属性props:worker-id: 666# 定义分配算法,odd-even-algorithm为自定义算法名,这里采用了标准行表达式算法-奇偶分表的方式,禁用了主键范围查询sharding-algorithms:# 奇偶性分片是采用的内置行级表达式算法odd-even-algorithm:# 算法类型type: INLINE# 算法属性props:algorithm-expression: course_$->{cid % 2 + 1}allow-range-query-with-inline-sharding: false# 内置的日期算法我没玩明白,如果有调试成功的小伙伴,记得留言告诉我month-algorithm:# 算法类型type: INTERVAL# 算法属性props:datetime-pattern: yyyy-MM-dd HH:mm:ssdatetime-lower: 2021-01-01 00:00:00datetime-upper: 2021-02-28 23:59:59sharding-suffix-pattern: yyyyMMdatetime-interval-amount: 1datetime-interval-unit: MONTHS# 年月分区是采用的这里的自定义算法custom-algorithm:# 算法类型type: CLASS_BASED# 算法属性props:strategy: STANDARDalgorithmClassName: org.springblade.useraction.algorithm.CustomAlgorithm# 对各表进行策略配置,course为表名tables:course:# 设置表名范围actual-data-nodes: ds1.course_$->{1..2}# 设置分表(片)策略,及算法所需的字段名table-strategy:standard:sharding-column: cidsharding-algorithm-name: odd-even-algorithm# 设置主键算法,及主键字段名key-generate-strategy:column: cidkey-generator-name: key-algorithmuser_action_log:# 设置表名范围actual-data-nodes: ds1.user_action_log_2022$->{['01','02']}# 设置分表(片)策略,及算法所需的字段名table-strategy:standard:sharding-column: datesharding-algorithm-name: custom-algorithm#sharding-algorithm-name: month-algorithm# 设置主键算法,及主键字段名key-generate-strategy:column: idkey-generator-name: key-algorithm# 配置控制台输出SQL语句props:sql-show: true

项目结构(右边是打开的启动类,记得加Mapper扫描):

CustomAlgorithm算法类:

package org.springblade.useraction.algorithm;import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;/*** @author RedstoneY* @description 年月分片算法* @date 2022年02月02日 14:08*/
public class CustomAlgorithm implements StandardShardingAlgorithm<Date> {/*** 用于插入时寻表* @param availableTargetNames* @param shardingValue* @return*/@Overridepublic String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Date> shardingValue) {// 表名前缀System.out.println(shardingValue.getLogicTableName());// 分表字段System.out.println(shardingValue.getColumnName());// 分表字段的值System.out.println(shardingValue.getValue());// 取分表字段中的年、月SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");// 拼接表名String tableName = shardingValue.getLogicTableName()+"_"+sdf.format(shardingValue.getValue());return tableName;}/*** 用于限制表名的范围* @param availableTargetNames* @param shardingValue* @return*/@Overridepublic Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<Date> shardingValue) {// 表名前缀System.out.println(shardingValue.getLogicTableName());// 分表字段System.out.println(shardingValue.getColumnName());// 分表字段的下限System.out.println(shardingValue.getValueRange().lowerEndpoint());// 分表字段的上限System.out.println(shardingValue.getValueRange().upperEndpoint());// 这部分没深究,估计是这么玩的List<String> tableNames = new ArrayList<>();tableNames.add(shardingValue.getLogicTableName()+"_"+"202201");tableNames.add(shardingValue.getLogicTableName()+"_"+"202202");return tableNames;}@Overridepublic void init() {}@Overridepublic String getType() {return null;}}

Course实体类:

package org.springblade.useraction.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;/*** * @TableName course*/
// 重要,这里不要加该注解,某则会影响分片
//@TableName("course")
@Data
public class Course implements Serializable {/*** */@TableId(value = "cid")private Long cid;/*** */@TableField(value = "cname")private String cname;/*** */@TableField(value = "user_id")private Long userId;/*** */@TableField(value = "cstatus")private String cstatus;@TableField(exist = false)private static final long serialVersionUID = 1L;
}

UserActionLog实体类:

package org.springblade.useraction.entity;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
import lombok.Data;/*** * @TableName user_action_log*/
// 重要,这里不要加该注解,某则会影响分片
//@TableName("user_action_log")
@Data
public class UserActionLog implements Serializable {/*** 主键*/@TableId(value = "id")private Long id;/*** 用户姓名*/@TableField(value = "name")private String name;/*** 访问时间*/@TableField(value = "date")private Date date;/*** 用户访问的路径*/@TableField(value = "path")private String path;@TableField(exist = false)private static final long serialVersionUID = 1L;@Overridepublic String toString() {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return "UserActionLog{" +"id=" + id +", name='" + name + '\'' +", date=" + sdf.format(date) +", path='" + path + '\'' +'}';}
}

Mapper接口(注意这里是两个,比较短,我就放一块了):

package org.springblade.useraction.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springblade.useraction.entity.Course;/**
* @Entity org.springblade.useraction.entity.Course
*/
public interface CourseMapper extends BaseMapper<Course> {}package org.springblade.useraction.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springblade.useraction.entity.UserActionLog;/**
* @Entity org.springblade.useraction.entity.UserActionLog202201
*/
public interface UserActionLogMapper extends BaseMapper<UserActionLog> {}

测试类:

package org.springblade.useraction;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.junit.jupiter.api.Test;
import org.springblade.useraction.entity.Course;
import org.springblade.useraction.entity.UserActionLog;
import org.springblade.useraction.mapper.CourseMapper;
import org.springblade.useraction.mapper.UserActionLogMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;@SpringBootTest
class UseractionApplicationTests {@Autowiredprivate CourseMapper courseMapper;@Autowiredprivate UserActionLogMapper userActionLogMapper;@Testpublic void addCourse() {for (int i=0; i<10; i++) {Course course = new Course();course.setCname("张三"+i);course.setUserId(100L+i);course.setCstatus("Java"+i);courseMapper.insert(course);}}/*** 插入用户行为日志,2022年1月25日及后10天的数据。* @throws ParseException 抛了个异常*/@Testpublic void addUserActionLog() throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Calendar cal = Calendar.getInstance();cal.setTime(sdf.parse("2022-01-25 10:00:00"));for (int i=0; i<10; i++) {UserActionLog userActionLog = new UserActionLog();userActionLog.setName("李四"+i);userActionLog.setDate(cal.getTime());userActionLog.setPath("path_"+i);userActionLogMapper.insert(userActionLog);cal.add(Calendar.DAY_OF_MONTH, 1);}}/*** 查询用户行为日志,2022年1月30日~2022年2月2日的数据* @throws ParseException 抛了个异常*/@Testpublic void getUserActionLogs() throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date startDate = sdf.parse("2022-01-30 00:00:00");Date endDate = sdf.parse("2022-02-02 23:59:59");LambdaQueryWrapper<UserActionLog> lqw = new LambdaQueryWrapper<>();lqw.ge(UserActionLog::getDate, startDate);lqw.le(UserActionLog::getDate, endDate);List<UserActionLog> userActionLogs = userActionLogMapper.selectList(lqw);for (UserActionLog userActionLog : userActionLogs) {System.out.println(userActionLog);}}}

Sharding4.0.0-RC1

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.1.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>org.springblade</groupId><artifactId>useraction</artifactId><version>0.0.1-SNAPSHOT</version><name>useraction</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.22</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.0</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

application.properties

# 萨丁4.0.0配置
# 配置数据库名称
spring.shardingsphere.datasource.names=ds1
# 配置实体类通用
spring.main.allow-bean-definition-overriding=true
# 配置数据库属性
spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://127.0.0.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=ffffff
# 配置分表范围
spring.shardingsphere.sharding.tables.course.actual-data-nodes=ds1.course_$->{1..2}
# 配置表中主键字段
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
# 设置主键字段的算法,插入数据时自动填充
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE
# 配置分表策略所用到的字段
spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-column=cid
# 配置分表策略的算法,采用行级表达式算法
spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expression=course_$->{cid % 2 + 1}
# 控制台输出SQL
spring.shardingsphere.props.sql.show=true

就说到这里,文章顶部我放了示例项目下载地址,需要花积分下载哟。

不过我把5.0.0的所需文件代码都贴了出来,相信大家也没有问题,拜拜~祝大家新年快乐!!

这篇关于ShardingJDBC-5.0.0及4.0.0使用示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/398007

相关文章

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

关于@MapperScan和@ComponentScan的使用问题

《关于@MapperScan和@ComponentScan的使用问题》文章介绍了在使用`@MapperScan`和`@ComponentScan`时可能会遇到的包扫描冲突问题,并提供了解决方法,同时,... 目录@MapperScan和@ComponentScan的使用问题报错如下原因解决办法课外拓展总结@

mysql数据库分区的使用

《mysql数据库分区的使用》MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下... 目录【一】分区的基本概念【1】物理存储与逻辑分割【2】查询性能提升【3】数据管理与维护【4】扩展性与并行处理【二】分区的

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma