700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > SpringBoot整合Sharding-JDBC分库分表中间件

SpringBoot整合Sharding-JDBC分库分表中间件

时间:2024-02-06 15:30:26

相关推荐

SpringBoot整合Sharding-JDBC分库分表中间件

1.引入依赖

主要引入Sharding-JDBC依赖sharding-jdbc-spring-boot-starter,其他的依赖都是为了后面的测试环节所准备的

pom.xml

<!-- sharding-jdbc --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1</version></dependency>

2.创建两个结构相同的表

创建两个结构相同的用户表(user0user1),两张表的建表语句如下

CREATE TABLE `user0` (`id` bigint(11) NOT NULL,`username` varchar(32) NOT NULL,`password` varchar(32) NOT NULL,`motto` varchar(255) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `user1` (`id` bigint(11) NOT NULL,`username` varchar(32) NOT NULL,`password` varchar(32) NOT NULL,`motto` varchar(255) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3.项目配置文件

application.yml

注意:主键生成使用sharding-jdbc提供的主键生成策略雪花算法,如果有读者对不了解雪花算法,可以到sharding-jdbc官网文档《Shard-JDBC官方文档-分布式主键》中了解,官网对使用该算法的原因和原理都讲的十分清楚,笔者在这里就不再赘述了~!

server:port: 9999spring:shardingsphere:props:sql:show: truedatasource:names: ds0ds0:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTCusername: rootpassword: 123456sharding:tables:user: # 水平分表,取模运算(user表的分布情况user0,user1)keyGeneratorColumnName: id # 主键keyGenerator:column: idtype: SNOWFLAKE # 使用雪花算法actualDataNodes: ds0.user$->{0..1} # 分库分表分表表达式,匹配user0和user1tableStrategy:inline:shardingColumn: id # 分片字段algorithmExpression: user$->{id % 2} # 分片表达式

4.编写user表实体类

/*** <p>user表实体类</p>* @author Bosen* @date /10/10 15:36*/@AllArgsConstructor@NoArgsConstructor@Datapublic class User {private long id;private String motto;private String username;private String password;}

5.编写user表映射接口

/*** <p>user表映射接口</p>* @author Bosen* @date /10/10 15:37*/@Repository@Mapperpublic interface UserMapper {@Insert("insert into user(username, password, motto) values(#{username}, #{password}, #{motto})")int insert(@Param("username") String username, @Param("password") String password, @Param("motto") String motto);@Select("select * from user where id = #{id}")User findById(@Param("id") long id);@Select("select * from user;")List<User> findAll();}

6.编写测试类

@SpringBootTestclass ShardingTestApplicationTests {@AutowiredUserMapper userMapper;@Testvoid testInsert() {System.out.println(userMapper.insert("张三", "123456", "长风破浪会有时,直挂云帆济沧海"));}@Testvoid testSelect() {System.out.println(userMapper.findById(653987601618829313L));}@Testvoid testFindAll() {System.out.println(userMapper.findAll());}}

1.执行方法testInsert(),并查看表user0user1的数据:

如上,通过查看两张表的数据,我们可以发现有一条id=653987601618829313的数据插入到了表user1中,而表user0为空。这是因为该id值通过分片表达式id % 2的计算得出结果1,进而得知该数据应该插入到表user1中,而非表user0

若现在我们再多插入几条数据,再次观察两张表中的数据:

此时我们发现,表user0中也有数据插入了,并且两张表的id值分别是偶数奇数

2.执行方法testSelect(),运行结果如下:

我们获取到了在表user1id=653987601618829313的数据

3.执行方法testFindAll(),运行结果如下:(此时我们可以得到两张表中的所有数据,为了易于分辨数据来源于哪一张表,笔者将user0表中的名字数据由张三改为了李四

至此,我们的SpringBoot已经成功整合Sharding-JDBC分库分表中间件,并测试完毕~!!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。