Sharding-JDBC 主要作用:简化对分库分表之后数据相关操作
(1)技术:SpringBoot 2.2.1+ MyBatisPlus + Sharding-JDBC + Druid 连接池
(2)创建 SpringBoot 工程
(3)引入需要的依赖
▼▼▼
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druid-spring-boot-starterartifactId>
<version>1.1.20version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
<dependency>
<groupId>org.apache.shardingspheregroupId>
<artifactId>sharding-jdbc-spring-boot-starterartifactId>
<version>4.0.0-RC1version>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.0.5version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
dependencies>
(1)创建数据库 course_db
(2)在数据库创建两张表 course_1 和 course_2
在项目 application.properties 配置文件中进行配置
▼▼▼
spring.shardingsphere.datasource.names=m1
▼▼▼
spring.main.allow-bean-definition-overriding=true
▼▼▼
spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSourc
e
spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/course_db?
serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m1.username=root
spring.shardingsphere.datasource.m1.password=root
▼▼▼
spring.shardingsphere.sharding.tables.course.actual-data-nodes=m1.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
▼▼▼
@RunWith(SpringRunner.class)
@SpringBootTest
public classShardingjdbcdemoApplicationTests {
//注入 mapper
@Autowired
privateCourseMappercourseMapper;
//添加课程的方法
@Test
public voidaddCourse() {
for(inti=1;i<=10;i++) {
Course course =newCourse();
course.setCname("java"+i);
course.setUserId(100L);
course.setCstatus("Normal"+i);
courseMapper.insert(course);
}
}
//查询课程的方法
@Test
public voidfindCourse() {
QueryWrapperwrapper =newQueryWrapper<>();
wrapper.eq("cid",465114665106538497L);
Course course =courseMapper.selectOne(wrapper);
System.out.println(course);
}
}
(1)上面测试代码执行,报错了
# 一个实体类对应两张表,覆盖
▼▼▼
spring.main.allow-bean-definition-overriding=true
创建两个数据库db1和db2,每个数据库创建两张表tab1和tab2,每个表中包括两个字段cid和userId。
▼▼▼
spring.shardingsphere.datasource.names=m1,m2
▼▼▼
spring.main.allow-bean-definition-overriding=true
▼▼▼
spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSourc
e
spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/edu_db_1?s
erverTimezone=GMT%2B8
spring.shardingsphere.datasource.m1.username=root
spring.shardingsphere.datasource.m1.password=root
#配置第二个数据源具体内容,包含连接池,驱动,地址,用户名和密码
▼▼▼
spring.shardingsphere.datasource.m2.type=com.alibaba.druid.pool.DruidDataSourc
e
spring.shardingsphere.datasource.m2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m2.url=jdbc:mysql://localhost:3306/edu_db_2?s
erverTimezone=GMT%2B8
spring.shardingsphere.datasource.m2.username=root
spring.shardingsphere.datasource.m2.password=root
#指定数据库分布情况,数据库里面表分布情况
▼▼▼
spring.shardingsphere.sharding.tables.course.actual-data-nodes=m$-
>{1..2}.course_$->{1..2}
# 指定 course 表里面主键 cid 生成策略 SNOWFLAKE
▼▼▼
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE
# 指定表分片策略 约定 cid 值偶数添加到 course_1 表,如果 cid 是奇数添加到course_2 表
▼▼▼
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}
# 指定数据库分片策略 约定 user_id 是偶数添加 m1,是奇数添加 m2
▼▼▼
#spring.shardingsphere.sharding.default-database-strategy.inline.sharding
column=user_id
#spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-
expression=m$->{user_id % 2 + 1}
spring.shardingsphere.sharding.tables.course.database
strategy.inline..sharding-column=user_id
spring.shardingsphere.sharding.tables.course.database
strategy.inline.algorithm-expression=m$->{user_id % 2 + 1}
# 打开 sql 输出日志
▼▼▼
spring.shardingsphere.props.sql.show=true
▼▼▼
//======================测试水平分库=====================
//添加操作
@Test
public voidaddCourseDb() {
Course course =newCourse();
course.setCname("javademo1");
//分库根据 user_id
course.setUserId(111L);
course.setCstatus("Normal1");
courseMapper.insert(course);
}
//查询操作
@Test
public voidfindCourseDb() {
QueryWrapper wrapper =newQueryWrapper<>();
//设置 userid 值
wrapper.eq("user_id",100L);
//设置 cid 值
wrapper.eq("cid",465162909769531393L);
Course course =courseMapper.selectOne(wrapper);
System.out.println(course);
}
Sharding-JDBC 通过 sql 语句语义分析,实现读写分离过程,不会做数据同步
▼▼▼
spring.shardingsphere.datasource.s0.type=com.alibaba.druid.pool.DruidDataSourc
e
spring.shardingsphere.datasource.s0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.s0.url=jdbc:mysql://localhost:3307/user_db?se
rverTimezone=GMT%2B8
spring.shardingsphere.datasource.s0.username=root spring.shardingsphere.datasource.s0.password=root
# 主库从库逻辑数据源定义 ds0 为 user_db
▼▼▼
spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source
name=m0
spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source
names=s0
▼▼▼
spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=ds0.t_user
//添加操作
@Test
public voidaddUserDb() {
User user =newUser();
user.setUsername("lucymary");
user.setUstatus("a");
userMapper.insert(user);
}
//查询操作
@Test
public voidfindUserDb() {
QueryWrapper wrapper =newQueryWrapper<>();
//设置 userid 值
wrapper.eq("user_id",465508031619137537L);
User user =userMapper.selectOne(wrapper);
System.out.println(user);
}
更多精彩干货分享
点击下方名片关注
IT那活儿
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/129943.html
摘要:第二部分介绍当当的弹性化中间件。第三部分当当的云化之路。下面部分是为当当运营人员与合作伙伴提供的系统,如商品价格库存等。下图是当当的监控系统以及限流系统的。当当采用的作业中间件是自研的,它可以将一个完整的作业拆分为多个相互独立的任务。 showImg(https://segmentfault.com/img/remote/1460000009999152); 6月24日,双态运维·乌镇...
摘要:实现数据库分库分表可以自己实现,也可以使用和实现。分布式数据库的自增不是自增的。分布式数据库分页查询需要使用插入时间实现。包含分库分片和读写分离功能。 Sharding-Jdbc实现mysql分库分表 简单介绍 数据库分库分表和读写分离区别,分库分表是在多个库建相同的表和同一个库建不同的表,根据随机或者哈希等方式查找实现。读写分离是为了解决数据库的读写性能不足,使用主库master进行...
摘要:现在的分片策略是上海深圳分别建库,每个库都存各自交易所的两支股票的,且按照月分表。五配置分片策略数据库分片策略在这个实例中,数据库的分库就是根据上海和深圳来分的,在中是单键分片。 由于当当发布了最新的Sharding-Sphere,所以本文已经过时,不日将推出新的版本 项目中遇到了分库分表的问题,找到了shrding-jdbc,于是就搞了一个springboot+sharding-jd...
阅读 1347·2023-01-11 13:20
阅读 1685·2023-01-11 13:20
阅读 1133·2023-01-11 13:20
阅读 1860·2023-01-11 13:20
阅读 4101·2023-01-11 13:20
阅读 2705·2023-01-11 13:20
阅读 1386·2023-01-11 13:20
阅读 3598·2023-01-11 13:20