ShardingSphere
一套开源的分布式数据库中间件解决方案,定位为关系型数据库中间件,合理在分布式环境下使用关系型数据库操作。
官网地址: https://shardingsphere.apache.org/index_zh.html
随着时间和业务发展,数据库数据量不可控的,造成表里面数据越来越多,如果再去对数据库表curd
操作时候,造成性能问题。为了解决由于数据量过大而造成数据库性能降低问题。
分库分表有两种方式:
把单一数据库按照业务进行划分,专库专表。
操作数据库中某张表,把这张表中一部分字段数据存到一张新表里面,再把这张表另一部分字段数据存到另外一张表里面,把一张表拆成多张表。
复制多个相同的库,可以根据配置规则让不同的数据进入不同的数据库。
在同一个库里,赋值多个相同的表结构,根据配置规则,让不同的数据进入不同的表。
Sharding-JDBC
是当当网研发的开源分布式数据库中间件,从 3.0
开始Sharding-JDBC
被包含在 ShardingSphere
中,之后该项目进入进入Apache
孵化器,4.0
版本之后的版本为Apache
版本。
Sharding-JDBC
是ShardingSphere
的第一个产品,也是ShardingSphere
的前身。 它定位为轻量级Java
框架,在Java
的JDBC
层提供的额外服务。它使用客户端直连数据库,以jar
包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC
驱动,完全兼容JDBC
和各种ORM
框架。
Sharding-JDBC
的核心功能为数据分片和读写分离,通过Sharding-JDBC
,应用可以透明的使用JDBC
访问已经分库分表、读写分离的多个数据源,而不用关心数据源的数量以及数据如何分布。
环境说明:
SpringBoot 2.5.7
+MyBatisPlus
+ShardingSphere-JDBC 5.0.0-alpha
+Druid
+MySQL 8.0
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger2artifactId>
<version>2.9.2version>
dependency>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger-uiartifactId>
<version>2.9.2version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>1.1.13version>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.4.3version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.27version>
dependency>
<dependency>
<groupId>org.apache.shardingspheregroupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starterartifactId>
<version>5.0.0-alphaversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
按照水平分表的方式,创建数据库和数据库表
ss_course_db_1
(为后面分库做准备,另一个数据库名:ss_course_db_2
)t_course_1
、t_course_2
cid
是偶数把数据添加t_course_1
,如果cid
奇数添加到t_course_2
drop table if EXISTS t_course_1;
create table t_course_1(
cid BIGINT(20) PRIMARY KEY,
cname VARCHAR(50) NOT NULL,
user_id BIGINT(20) NOT NULL,
cstatus VARCHAR(10) NOT NULL
);
drop table if EXISTS t_course_2;
create table t_course_2(
cid BIGINT(20) PRIMARY KEY,
cname VARCHAR(50) NOT NULL,
user_id BIGINT(20) NOT NULL,
cstatus VARCHAR(10) NOT NULL
);
此处编写业务代码略,具体代码可以下面的源码地址,经过本人调试过。代码里集成了Swagger
,用于方便测试。
server.port=8001
spring.shardingsphere.enabled=true
# 配置数据源,给数据源起名称
spring.shardingsphere.datasource.names=m0
# 打开sql输出日志
spring.shardingsphere.props.sql-show=true
# 配置第一个数据源具体内容,包含连接池,驱动,地址,用户名和密码
spring.shardingsphere.datasource.common.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.common.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m0.url=jdbc:mysql://127.0.0.1:3306/ss_course_db_1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2b8
spring.shardingsphere.datasource.m0.username=root
spring.shardingsphere.datasource.m0.password=123456
# 指定course表里面主键cid 生成策略 SNOWFLAKE
spring.shardingsphere.rules.sharding.key-generators.snowflake.type=SNOWFLAKE
spring.shardingsphere.rules.sharding.key-generators.snowflake.props.worker-id=123
# 指定course表分布情况,配置表在哪个数据库里面,表名称都是什么 m0.t_course_1 , m0.t_course_2
spring.shardingsphere.rules.sharding.tables.t_course.actual-data-nodes=m0.t_course_$->{1..2}
# 指定表分片策略 约定cid值偶数添加到t_course_1表,如果cid是奇数添加到t_course_2表
spring.shardingsphere.rules.sharding.tables.t_course.table-strategy.standard.sharding-column=cid
spring.shardingsphere.rules.sharding.tables.t_course.table-strategy.standard.sharding-algorithm-name=table-inline
spring.shardingsphere.rules.sharding.sharding-algorithms.table-inline.type=INLINE
spring.shardingsphere.rules.sharding.sharding-algorithms.table-inline.props.algorithm-expression=t_course_$->{cid % 2 + 1}
启动程序,在浏览器输入:http://localhost:8001/swagger-ui.html
添加课程
查看数据库表数据
查看所有课程数据
源码地址:https://github.com/Hofanking/springboot-shardingsphere-example
源代码目录结构说明:
springboot-shardingsphere-example
|— shardingsphere-database (分库分表)
|— shardingsphere-database-table-write-read (分库分表读写分离)
|— shardingsphere-proxy-table (使用proxy分表)
|— shardingsphere-public (公共表)
|— shardingsphere-table (分表)
|— shardingsphere-write-read (读写分离)