shardingsphere5.2.1与SpringBoot3.X的版本冲突问题
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);}}
}
最后运行方法验证一下,是不是把插入的数据分到两个数据库中的四张表。
我想,下面的这些你也一定看了吧