Sharding-JDBC 主要作用:簡化對分庫分表之后數(shù)據(jù)相關(guān)操作
(1)技術(shù):SpringBoot 2.2.1+ MyBatisPlus + Sharding-JDBC + Druid 連接池
(2)創(chuàng)建 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)創(chuàng)建數(shù)據(jù)庫 course_db
(2)在數(shù)據(jù)庫創(chuàng)建兩張表 course_1 和 course_2
在項目 application.properties 配置文件中進(jìn)行配置
▼▼▼
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)上面測試代碼執(zhí)行,報錯了
# 一個實(shí)體類對應(yīng)兩張表,覆蓋
▼▼▼
spring.main.allow-bean-definition-overriding=true
創(chuàng)建兩個數(shù)據(jù)庫db1和db2,每個數(shù)據(jù)庫創(chuàng)建兩張表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
#配置第二個數(shù)據(jù)源具體內(nèi)容,包含連接池,驅(qū)動,地址,用戶名和密碼
▼▼▼
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
#指定數(shù)據(jù)庫分布情況,數(shù)據(jù)庫里面表分布情況
▼▼▼
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 值偶數(shù)添加到 course_1 表,如果 cid 是奇數(shù)添加到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}
# 指定數(shù)據(jù)庫分片策略 約定 user_id 是偶數(shù)添加 m1,是奇數(shù)添加 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");
//分庫根據(jù) user_id
course.setUserId(111L);
course.setCstatus("Normal1");
courseMapper.insert(course);
}
//查詢操作
@Test
public voidfindCourseDb() {
QueryWrapper wrapper =newQueryWrapper<>();
//設(shè)置 userid 值
wrapper.eq("user_id",100L);
//設(shè)置 cid 值
wrapper.eq("cid",465162909769531393L);
Course course =courseMapper.selectOne(wrapper);
System.out.println(course);
}
Sharding-JDBC 通過 sql 語句語義分析,實(shí)現(xiàn)讀寫分離過程,不會做數(shù)據(jù)同步
▼▼▼
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
# 主庫從庫邏輯數(shù)據(jù)源定義 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<>();
//設(shè)置 userid 值
wrapper.eq("user_id",465508031619137537L);
User user =userMapper.selectOne(wrapper);
System.out.println(user);
}
更多精彩干貨分享
點(diǎn)擊下方名片關(guān)注
IT那活兒
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/129943.html
摘要:它是第一個把數(shù)據(jù)分布在全球范圍內(nèi)的系統(tǒng),并且支持外部一致性的分布式事務(wù)。目的是使得開發(fā)者閱讀之后,能對項目有一個初步了解,更好的參與進(jìn)入的開發(fā)中。深度探索數(shù)據(jù)庫并發(fā)控制技術(shù)并發(fā)控制技術(shù)是數(shù)據(jù)庫事務(wù)處理的核心技術(shù)。 存儲過程高級篇 講解了一些存儲過程的高級特性,包括 cursor、schema、控制語句、事務(wù)等。 數(shù)據(jù)庫索引與事務(wù)管理 本篇文章為對數(shù)據(jù)庫知識的查缺補(bǔ)漏,從索引,事務(wù)管理,...
摘要:第二部分介紹當(dāng)當(dāng)?shù)膹椥曰虚g件。第三部分當(dāng)當(dāng)?shù)脑苹贰O旅娌糠质菫楫?dāng)當(dāng)運(yùn)營人員與合作伙伴提供的系統(tǒng),如商品價格庫存等。下圖是當(dāng)當(dāng)?shù)谋O(jiān)控系統(tǒng)以及限流系統(tǒng)的。當(dāng)當(dāng)采用的作業(yè)中間件是自研的,它可以將一個完整的作業(yè)拆分為多個相互獨(dú)立的任務(wù)。 showImg(https://segmentfault.com/img/remote/1460000009999152); 6月24日,雙態(tài)運(yùn)維·烏鎮(zhèn)...
摘要:實(shí)現(xiàn)數(shù)據(jù)庫分庫分表可以自己實(shí)現(xiàn),也可以使用和實(shí)現(xiàn)。分布式數(shù)據(jù)庫的自增不是自增的。分布式數(shù)據(jù)庫分頁查詢需要使用插入時間實(shí)現(xiàn)。包含分庫分片和讀寫分離功能。 Sharding-Jdbc實(shí)現(xiàn)mysql分庫分表 簡單介紹 數(shù)據(jù)庫分庫分表和讀寫分離區(qū)別,分庫分表是在多個庫建相同的表和同一個庫建不同的表,根據(jù)隨機(jī)或者哈希等方式查找實(shí)現(xiàn)。讀寫分離是為了解決數(shù)據(jù)庫的讀寫性能不足,使用主庫master進(jìn)行...
摘要:現(xiàn)在的分片策略是上海深圳分別建庫,每個庫都存各自交易所的兩支股票的,且按照月分表。五配置分片策略數(shù)據(jù)庫分片策略在這個實(shí)例中,數(shù)據(jù)庫的分庫就是根據(jù)上海和深圳來分的,在中是單鍵分片。 由于當(dāng)當(dāng)發(fā)布了最新的Sharding-Sphere,所以本文已經(jīng)過時,不日將推出新的版本 項目中遇到了分庫分表的問題,找到了shrding-jdbc,于是就搞了一個springboot+sharding-jd...
閱讀 1356·2023-01-11 13:20
閱讀 1707·2023-01-11 13:20
閱讀 1215·2023-01-11 13:20
閱讀 1906·2023-01-11 13:20
閱讀 4165·2023-01-11 13:20
閱讀 2757·2023-01-11 13:20
閱讀 1402·2023-01-11 13:20
閱讀 3671·2023-01-11 13:20