Sharding-JDBC 实现垂直分库
Posted 爱上口袋的天空
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sharding-JDBC 实现垂直分库相关的知识,希望对你有一定的参考价值。
一、需求分析
需要查询用户信息的时候,不需要查到课程信息。
二、创建用户数据库、数据表
create database user_db; use user_db; create table t_user( `user_id` bigint(20) primary key, `username` varchar(100) not null, `ustatus` varchar(50) not null );
三、编写User代码
创建user实体类和对应的mapper、controller、service
package com.sharding.demo.model; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName("t_user") //指定对应的表名 public class User private Long userId; private String username; private String ustatus;
Controller:
package com.sharding.demo.web; import com.sharding.demo.model.User; import com.sharding.demo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RequestMapping("user") @RestController public class UserController @Autowired private UserService userService; @RequestMapping(value = "addUser") public void addUser() for (int i = 0; i < 10; i++) User user = new User(); user.setUsername("java"+i); user.setUstatus(i%2==0?String.valueOf(1):String.valueOf(0)); userService.addUser(user); @RequestMapping(value = "queryUserByParams") public List<User> queryUserByParams() return userService.queryUserByParams();
service:
package com.sharding.demo.service; import com.sharding.demo.model.User; import java.util.List; public interface UserService void addUser(User user); List<User> queryUserByParams();
serviceImpl:
package com.sharding.demo.service.impl; import com.sharding.demo.mapper.UserMapper; import com.sharding.demo.model.User; import com.sharding.demo.service.UserService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; @Service public class UserServiceImpl implements UserService @Resource private UserMapper userMapper; @Override public void addUser(User user) userMapper.insert(user); @Override public List<User> queryUserByParams() return userMapper.selectList(null);
UserMapper:
package com.sharding.demo.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.sharding.demo.model.User; public interface UserMapper extends BaseMapper<User>
四、配置垂直分库策略
spring: shardingsphere: # 数据源配置 datasource: # 数据源名称,多数据源以逗号分隔,名称可以随意起名 names: db1 db1: #配置第一个数据源 driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource password: Tz@202011 username: root url: jdbc:mysql://192.168.56.20:3306/user_db?allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai rules: sharding: # 分片算法配置 sharding-algorithms: user-table-inline: # 分表的策略 type: INLINE # 分片算法类型 props: # 分片算法的行表达式 algorithm-expression: t_user # 分布式序列算法配置 key-generators: user-snowflake: type: snowflake #分布式序列算法类型,雪花算法:SNOWFLAKE; UUID:UUID) column: user_id #分布式主键列 tables: # 逻辑表名称 t_user: # 行表达式标识符可以使用 $... 或 $->...,但前者与 Spring 本身的属性文件占位符冲突,因此在 Spring 环境中使用行表达式标识符建议使用 $->... actual-data-nodes: db1.t_user # 分表策略 table-strategy: standard: # 分片列名称 sharding-column: user_id # 分片算法名称 sharding-algorithm-name: user-table-inline key-generate-strategy: column: user_id #分布式序列列名称 key-generator-name: user-snowflake #分布式序列算法名称 # 属性配置 props: # 展示修改以后的sql语句 sql-show: true
五、进行测试
1、测试新增方法
2、测试查询方法
以上是关于Sharding-JDBC 实现垂直分库的主要内容,如果未能解决你的问题,请参考以下文章