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 实现垂直分库的主要内容,如果未能解决你的问题,请参考以下文章

Sharding-JDBC 垂直分库和公共表

SpringBoot使用sharding-jdbc分库分表

分库分表开源中间件之Sharding-JDBC使用体验

解读分库分表中间件Sharding-JDBC

shardingsphere

shardingsphere