1.先說一下我的版本配置與遇到的問題
?問題產生的依賴和版本:
主要依賴 | 依賴版本 |
---|---|
jdk | 17 |
SpringBoot? | 3.3.13 |
shardingsphere-jdbc? | 5.2.1 |
問題產生的原因:
主要就是shardingsphere-jdbc 與SpringBoot版本沖突,因為Spring Boot 需要 SnakeYAML 庫來解析 YAML 配置文件
Spring Boot 3.x 默認使用 SnakeYAML 2.x(新 API)
ShardingSphere 5.2.1 依賴 SnakeYAML 1.x(舊 API)
問題解決的方法:
1.升級ShardingSphere的版本
升級版本讓ShardingSphere支持SnakeYAML 2.x(新 API)
截止2025年6月30日,ShardingSphere官方文檔的最新版本是5.5.1
從5.2.1版本以后,ShardingSphere-jdbc的導入就發生了變化
5.2.1以前是(包括5.2.1)
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>${latest.release.version}</version> </dependency>
5.2.1以后是
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core</artifactId><version>${latest.release.version}</version> </dependency>
就連yaml配置也有了一些改變,官方文檔說的很不明白,我是沒看懂到底怎么配置的(鄙人小白,勿噴)
我也沒弄明白哪一個高版本是支持SnakeYAML 2.x(新 API)
同時我也沒搞懂高版本的yaml如何配置,所以我采取了第二種方法,如下 ↓?
2.降低SpringBoot的版本至2.X
Spring Boot 3.x 默認使用 SnakeYAML 2.x(新 API)
Spring Boot 2.x 默認使用 SnakeYAML 1.x(舊?API)
最后我把SpringBoot的版本降為了2.7.6,jdk的也修改為了jdk8,
我沒用過jdk11,不過只要和SpringBoot版本兼容應該沒有問題。
2. (修改后的)我的所有配置
先看yaml配置:
server:port: 8080spring:application:name: shardingJdbcshardingsphere:datasource:names: ds0,ds1ds0:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/szml_demo0?serverTimezone=UTCusername: rootpassword: ******ds1:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/szml_demo1?serverTimezone=UTCusername: rootpassword: ******rules:sharding:key-generators:snowflake:type: SNOWFLAKEprops:worker-id: 666sharding-algorithms:database-inline:type: INLINEprops:algorithm-expression: ds$->{(user_id % 100 / 10).intValue() % 2}table-inline:type: INLINEprops:algorithm-expression: users$->{user_id % 2 + 1}tables:users:actual-data-nodes: ds$->{0..1}.users$->{1..2}database-strategy:standard:sharding-column: user_idsharding-algorithm-name: database-inlinetable-strategy:standard:sharding-column: user_idsharding-algorithm-name: table-inlinekey-generate-strategy:column: user_idkey-generator-name: snowflakeprops:sql-show: trueoutput:ansi:enabled: ALWAYS
logging:level:org.springframework.web: debug
我是分了兩個庫,每一個庫又分了兩張表
我寫的時候忘給yaml加注解了,不過大家可以去官網參考一下
https://shardingsphere.apache.org/document/5.2.1/cn/user-manual/shardingsphere-jdbc/yaml-config/
我的pom文件中引入的依賴:
<?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.7.6</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.wmb</groupId><artifactId>shardingJdbc</artifactId><version>0.0.1-SNAPSHOT</version><name>shardingJdbc</name><description>shardingJdbc</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter-test</artifactId><version>2.3.1</version><scope>test</scope></dependency><!-- shardingJDBC核?依賴 --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.2.1</version><exclusions><exclusion><artifactId>snakeyaml</artifactId><groupId>org.yaml</groupId></exclusion></exclusions></dependency><!-- 版本沖突 --><dependency><groupId>org.yaml</groupId><artifactId>snakeyaml</artifactId><version>1.33</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.21</version></dependency></dependencies><build><plugins>
<!-- <plugin>-->
<!-- <groupId>org.apache.maven.plugins</groupId>-->
<!-- <artifactId>maven-compiler-plugin</artifactId>-->
<!-- <configuration>-->
<!-- <annotationProcessorPaths>-->
<!-- <path>-->
<!-- <groupId>org.projectlombok</groupId>-->
<!-- <artifactId>lombok</artifactId>-->
<!-- </path>-->
<!-- </annotationProcessorPaths>-->
<!-- </configuration>-->
<!-- </plugin>--><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>
我也學過mybatis-plus,確實好用,但是沒真的用過,只是學過,推薦大家都學習一下,嘿嘿~
接下來嘗試ShardingSphere與seata結合使用
到這里的結束了,下面的都不用看了~ ~ ~
下面都是項目中最基本的一個類和一個測試以及一個mapper,來驗證分庫分表的成功執行:
sql表,每一個庫兩張表(users1和users2):
CREATE TABLE users (user_id BIGINT PRIMARY KEY,username VARCHAR(50),password VARCHAR(255),email VARCHAR(100),phone VARCHAR(20),gmt_create TIMESTAMP
);
?實體類User:
public class User {private Long uerId;private String username;private String password;private String email;private String phone;private LocalDateTime gmtCreate;
}
插入語句:?
因為創建的 users? 表,這里寫users即可,表的后綴不用謝,這里報錯是正常的,不用管,能跑就行,我也沒有深究這里的表名具體怎么寫才不會報錯,有懂的 佬 可以評論一下給我答疑解惑。
還有一件事,如果使用mybatis-plus,直接繼承,這里就不用寫了
@Insert("insert into users (username,password,email,phone,gmt_create) " +"values (#{username},#{password},#{email},#{phone},#{gmtCreate})" )Integer insert(User user);
測試方法:
@SpringBootTest
public class UserInsertTest {@Autowiredprivate UserMapper userMapper;@Testpublic void insertUser() {for(int i = 0; i < 10; i++){User user = new User();user.setUsername("user_" + i);user.setPassword("123456_" + i);user.setEmail("email_" + i);user.setPhone("phone_" + i);user.setGmtCreate(LocalDateTime.now());userMapper.insert(user);System.out.println(user);}}
}
最后運行方法驗證一下,是不是把插入的數據分到兩個數據庫中的四張表。
我想,下面的這些你也一定看了吧