当前位置:网站首页>ShardingSphere之水平分表实战(三)
ShardingSphere之水平分表实战(三)
2022-07-29 03:12:00 【融极】
概述
搭建环境
Springboot2.3.2.RELEASE + Tkmybatis + Sharding-jdbc + Druid
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.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.study</groupId>
<artifactId>shardingjdbcdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>shardingjdbcdemo</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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.14</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</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>
<!-- tkmybatis -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.1.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
建库、建表
库、表设计:
- 创建数据库course_db。
- 在数据库中创建两种表course_1和course_2。
- 约定规则:如果添加课程id是偶数把数据添加到course_1,奇数添加到course_2。
新建数据库course_db。
新建表course_1和course_2。
CREATE TABLE `course_1` (
`cid` bigint(20) NOT NULL,
`cname` varchar(50) NOT NULL,
`user_id` bigint(20) NOT NULL,
`cstatus` varchar(10) NOT NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
代码结构

package com.study.shardingjdbcdemo.entity;
import lombok.Data;
@Data
public class Course {
@Id
private Long cid;
private String cname;
@Column(name = "user_id")
private Long userId;
private String cstatus;
}
package com.study.shardingjdbcdemo.mapper;
import com.study.shardingjdbcdemo.entity.Course;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;
@Repository
public interface CourseMapper extends Mapper<Course> {
}
package com.study.shardingjdbcdemo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.study.shardingjdbcdemo.mapper")
public class ShardingjdbcdemoApplication {
public static void main(String[] args) {
SpringApplication.run(ShardingjdbcdemoApplication.class, args);
}
}
package com.study.shardingjdbcdemo;
import com.study.shardingjdbcdemo.mapper.CourseMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class ShardingjdbcdemoApplicationTests {
@Autowired
private CourseMapper courseMapper;
@Test
void contextLoads() {
}
}
配置Sharding-JDBC分片策略
application.properties
# 配置分片策略
# 配置数据源
spring.shardingsphere.datasource.names=m1
spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource
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=123456
# 指定course表分布情况,配置表在哪个数据库中,表名称都是什么
spring.shardingsphere.sharding.tables.course.actual-data-nodes=m1.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}
# 打开sql输出日志
spring.shardingsphere.props.sql.show=true
测试
测试用例
package com.study.shardingjdbcdemo;
import com.study.shardingjdbcdemo.entity.Course;
import com.study.shardingjdbcdemo.mapper.CourseMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class ShardingjdbcdemoApplicationTests {
@Autowired
private CourseMapper courseMapper;
@Test
void add() {
for (int i = 0; i < 10; i++) {
Course course = new Course();
course.setCname("java");
course.setUserId(100L);
course.setCstatus("normal");
// 注意使用insertSelective,否则会报错,因为sharding-jdbc会自己生成主键字段并拼接到sql中,如果sql语句中带有cid主键就会重复报错
courseMapper.insertSelective(course);
}
}
@Test
void query() {
List<Course> courses = courseMapper.selectAll();
courses.forEach(System.out::println);
}
}
测试报错
The bean 'dataSource', defined in class path resource [org/apache/shardingsphere/shardingjdbc/spring/boot/SpringBootConfiguration.class], could not be registered. A bean with that name has already been defined in class path resource [com/alibaba/druid/spring/boot/autoconfigure/DruidDataSourceAutoConfigure.class] and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
解决方案
application.properties中添加配置
# 解决一个Course实体类不能对应两张表的问题
spring.main.allow-bean-definition-overriding=true
边栏推荐
- 接口自动化测试实践指导(上):接口自动化需要做哪些准备工作
- MYSQL入门与进阶(十一)
- Server operation management system
- C traps and defects Chapter 3 semantic "traps" 3.3 array declaration as parameters
- Multi table (Association) query of SQL query data
- Unity 之游戏特效
- Incremental real-time disaster recovery notes
- 「PHP基础知识」输出圆周率的近似值
- C traps and defects Chapter 3 semantic "traps" 3.8 operators &, |, and!
- 军品研制过程-转阶段
猜你喜欢

Plato Farm在Elephant Swap上铸造的ePLATO是什么?为何具备高溢价?

A case of gradually analyzing the splitting of classes -- colorful ball collisions

12_ UE4 advanced_ Change a more beautiful character model

MySQL installation and configuration super detailed tutorial and simple database and table building method

Verilog's time system tasks - $time, $stime, $realtime

Learn more than 4000 words, understand the problem of this pointing in JS, and handwrite to realize call, apply and bind

C语言基础知识点汇总

Multi table (Association) query of SQL query data

融云 IM & RTC 能力上新盘点

Redis configuration cache expiration listening event trigger
随机推荐
HTB-Blocky
MYSQL入门与进阶(十一)
Verilog的时间系统任务----$time、$stime、$realtime
Li Shuo, vice president of Baidu: it's a good thing that China's labor costs rise with the support of digital technology
Introduction and advanced level of MySQL (11)
Flask creation process day05-06 creation project
2.nodejs--路径(_dirname,_filname)、url网址、querystring模块、mime模块、各种路径(相对路径)、网页的加载(面试题*)
12_ UE4 advanced_ Change a more beautiful character model
《QA离业务代码能有多近?》QA对业务代码进行可测性改造
GJB常见混淆概念
Plato Farm在Elephant Swap上铸造的ePLATO是什么?为何具备高溢价?
Watermelon book learning Chapter 6 -- SVM
mysql大表联合查询优化,大事务优化,规避事务超时,锁等待超时与锁表
13_ UE4 advanced_ Montage animation realizes attack while walking
sqlilabs less-32~less-33
单例模式(饿汉式 懒汉式)
反脆弱·从不确定性中获益---管理?
会议OA项目之我的审批功能
kubernetes-1.24.x 特性
国产ERP有没有机会击败SAP ?