zoukankan      html  css  js  c++  java
  • sharding-jdbc分库使用

    ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar这3款相互独立的产品组成,本次使用sharding-jdbc来分库。项目采用Spring boot + mybatis 。

    初始化一个Springboot项目

    • 引入项目依赖
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    
        <!--web核心依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    
        <!--mysql数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
    
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
    
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>
    
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-namespace</artifactId>
            <version>4.1.0</version>
        </dependency>
    
    </dependencies>
    
    

    在mysql中创建两个测试库,在两个测试库中创建相同的一张表user

    
    建表语句
    
    DROP TABLE IF EXISTS `user`;
    
    CREATE TABLE "user" (
    
      "id" bigint(20) NOT NULL,
    
      "name" varchar(60) NOT NULL,
    
      "age" int(3) NOT NULL,
    
      PRIMARY KEY ("id")
    
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    SET FOREIGN_KEY_CHECKS = 1;
    
    

    引入sharding-jdbc的yaml配置

    
    spring:
      shardingsphere:
        datasource:
          names: ds0,ds1 # 配置ds0 和ds1两个数据源,ds01/02分别是测试库的别名
          ds0:
            type: com.zaxxer.hikari.HikariDataSource
            driver-class-name: com.mysql.cj.jdbc.Driver
            jdbc-url: jdbc:mysql://数据库ip地址1:32636/数据库名?useUnicode=true&characterEncoding=utf-8&useSSL=false
            username: xxx #数据库用户名
            password: xxx #数据库链接密码
          ds1:
            type: com.zaxxer.hikari.HikariDataSource
            driver-class-name: com.mysql.cj.jdbc.Driver
            jdbc-url: jdbc:mysql://数据库ip地址2:32636/数据库名?useUnicode=true&characterEncoding=utf-8&useSSL=false
            username: xxx #数据库用户名
            password: xxx #数据库链接密码
        sharding:
          default-data-source-name: ds0 #默认数据源,未分片的表默认执行库
          default-database-strategy:
            inline:  # 分库策略 根据id取模确定数据进哪个数据库
              sharding-column: id
              algorithm-expression: ds$->{id % 2}
          tables:
            user:
              actual-data-nodes: ds$->{0..1}.user # 具体分表策略
              key-generator:
                column: id
                type: SNOWFLAKE #使用雪花id,注意ID不能设置为自增长
        props:
          sql:
            show: true #打印sql日志
    

    项目演示

    • 创建user controller
    
    @RestController
    @RequestMapping("/v1/user")
    public class UserController {
    
        @Autowired
        private UserMapper userMapper;
    
        @PostMapping
        public User addUser(@RequestBody User user) {
            System.out.println(user.toString());
            userMapper.insert(user);
            return user;
        }
    
        @GetMapping
        public List<User> findAll(@RequestBody User user) {
            return userMapper.selectList(null);
        }
    }
    
    • 穿件domain
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    public class User {
    
        private Long id;
    
        private String name;
    
        private Integer age;
    }
    
    • service层看自己自行实现,本次测试不需要

    • 创建mapper

    
    public interface UserMapper extends BaseMapper<User> {
    }
    
    • 创建mapper.xml
    
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="com.example.demo.mapper.UserMapper">
    
    </mapper>
    

    启动测试

    • 通过postman,创建一个runner,

    可到数据库中查看两张user表中都存有数据。

  • 相关阅读:
    MVC 4 异步编程简化了
    Plextor 浦科特M7VC性能
    epson Robot 指令集合
    在MFC下面实际演示CCriticalSection 的使用
    如何看MFC程序
    SCADA 必备函数之 :关于消息的函数
    SCADA必备函数 实际测试。
    (转)extern关键字两种场景的使用
    (转)全局变量、extern/static/const区别与联系
    (转 )C++ static、const和static const 以及它们的初始化
  • 原文地址:https://www.cnblogs.com/levcon/p/14247316.html
Copyright © 2011-2022 走看看