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那活兒
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/129943.html
摘要:第二部分介紹當當的彈性化中間件。第三部分當當的云化之路。下面部分是為當當運營人員與合作伙伴提供的系統,如商品價格庫存等。下圖是當當的監控系統以及限流系統的。當當采用的作業中間件是自研的,它可以將一個完整的作業拆分為多個相互獨立的任務。 showImg(https://segmentfault.com/img/remote/1460000009999152); 6月24日,雙態運維·烏鎮...
摘要:實現數據庫分庫分表可以自己實現,也可以使用和實現。分布式數據庫的自增不是自增的。分布式數據庫分頁查詢需要使用插入時間實現。包含分庫分片和讀寫分離功能。 Sharding-Jdbc實現mysql分庫分表 簡單介紹 數據庫分庫分表和讀寫分離區別,分庫分表是在多個庫建相同的表和同一個庫建不同的表,根據隨機或者哈希等方式查找實現。讀寫分離是為了解決數據庫的讀寫性能不足,使用主庫master進行...
摘要:現在的分片策略是上海深圳分別建庫,每個庫都存各自交易所的兩支股票的,且按照月分表。五配置分片策略數據庫分片策略在這個實例中,數據庫的分庫就是根據上海和深圳來分的,在中是單鍵分片。 由于當當發布了最新的Sharding-Sphere,所以本文已經過時,不日將推出新的版本 項目中遇到了分庫分表的問題,找到了shrding-jdbc,于是就搞了一個springboot+sharding-jd...
閱讀 1353·2023-01-11 13:20
閱讀 1699·2023-01-11 13:20
閱讀 1211·2023-01-11 13:20
閱讀 1902·2023-01-11 13:20
閱讀 4161·2023-01-11 13:20
閱讀 2751·2023-01-11 13:20
閱讀 1397·2023-01-11 13:20
閱讀 3664·2023-01-11 13:20