首页 > 数据库技术 > 详细

Sharding-JDBC 实战

时间:2020-07-15 20:19:54      阅读:51      评论:0      收藏:0      [点我收藏+]

Sharding-JDBC简单使用


1.Sharding-JDBC之环境搭建


1.1 创建一个Maven项目 mysql-example,父工程项目pom.xml如下

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>mysql-example</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>sharding-jdbc-example</module>
    </modules>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.compile.sourceEncoding>UTF-8</project.compile.sourceEncoding>
        <shardingsphere.version>4.1.0</shardingsphere.version>
        <springboot.version>2.2.5.RELEASE</springboot.version>
    </properties>

  <dependencyManagement>
      <dependencies>
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-jdbc</artifactId>
              <version>${springboot.version}</version>
          </dependency>

          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-data-jpa</artifactId>
              <version>${springboot.version}</version>
          </dependency>

          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-test</artifactId>
              <version>${springboot.version}</version>
              <scope>test</scope>
          </dependency>

          <dependency>
              <groupId>mysql</groupId>
              <artifactId>mysql-connector-java</artifactId>
              <version>5.1.48</version>
          </dependency>
          <dependency>
              <groupId>org.apache.shardingsphere</groupId>
              <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
              <version>${shardingsphere.version}</version>
          </dependency>
      </dependencies>
  </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <testSource>1.8</testSource>
                    <testTarget>1.8</testTarget>
                </configuration>
                <version>3.8.1</version>
            </plugin>
        </plugins>
    </build>
</project>


1.2 创建子模块sharding-jdbc-example,子模块项目pom.xml如下

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>mysql-example</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>sharding-jdbc-example</artifactId>
  <dependencies>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-jdbc</artifactId>
      </dependency>

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-jpa</artifactId>
      </dependency>

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
      </dependency>

      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
      </dependency>
      <dependency>
          <groupId>org.apache.shardingsphere</groupId>
          <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
      </dependency>

  </dependencies>

</project>


2.Sharding-JDBC之职位分库业务


2.1数据库准备

  • 使用的mysql 5.5.54
  • 由于资源限制,我就在一个服务里建两个数据库lagou1,lagou2,创建相同的职位表,职位详情表

技术分享图片

  • 建表语句如下
#position表
CREATE TABLE `position` (
	`id` BIGINT ( 20 ) NOT NULL AUTO_INCREMENT,
	`name` VARCHAR ( 255 ) DEFAULT NULL,
	`salary` VARCHAR ( 50 ) DEFAULT NULL,
	`city` VARCHAR ( 255 ) DEFAULT NULL,
PRIMARY KEY ( `id` ) 
) ENGINE = INNODB AUTO_INCREMENT = 490171537622564865 DEFAULT CHARSET = utf8;

#position_detail表
CREATE TABLE `position_detail` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `pid` bigint(11) DEFAULT NULL,
  `description` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=490171537891000321 DEFAULT CHARSET=utf8;

2.2.2 创建实体类与Repository


# Position
package com.lagou.entity;

import javax.persistence.*;
import java.io.Serializable;

@Entity
@Table(name = "position")
public class Position implements Serializable{
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "name")
    private  String name;
    @Column(name = "salary")
    private  String salary;
    @Column(name = "city")
    private  String city;


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSalary() {
        return salary;
    }

    public void setSalary(String salary) {
        this.salary = salary;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @Override
    public String toString() {
        return "Position{" +
                "id=" + id +
                ", name=‘" + name + ‘\‘‘ +
                ", salary=‘" + salary + ‘\‘‘ +
                ", city=‘" + city + ‘\‘‘ +
                ‘}‘;
    }
}

#PositionDetail

package com.lagou.entity;

import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(name = "position_detail")
public class PositionDetail implements Serializable {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "pid")
    private Long pid;
    @Column(name = "description")
    private String description;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getPid() {
        return pid;
    }

    public void setPid(Long pid) {
        this.pid = pid;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

## PositionRepository
package com.lagou.repository;

import com.lagou.entity.Position;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface PositionRepository extends JpaRepository<Position,Long> {
    @Query(nativeQuery = true,value = "select p.id,p.name,p.salary,p.city,pd.description from position p join position_detail pd on(p.id =pd.pid) where p.id=:id")
    public Object findPositionsById(@Param("id") long id);
}

## PositionDetailRepository

package com.lagou.repository;

import com.lagou.entity.PositionDetail;
import org.springframework.data.jpa.repository.JpaRepository;

public interface PositionDetailRepository extends JpaRepository<PositionDetail,Long> {
}

## 启动类

package com.lagou;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class RunBoot {
}


2.2.3 配置文件

  • application.properties
spring.profiles.active=sharding-database
spring.shardingsphere.props.sql.show=true

  • application-sharding-database.properties
#datasource
spring.shardingsphere.datasource.names=ds0,ds1

spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds0.jdbc-url=jdbc:mysql://127.0.0.1:3306/lagou1
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=root
#连接池类型jpa默认的是HikariDataSource
spring.shardingsphere.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds1.jdbc-url=jdbc:mysql://127.0.0.1:3306/lagou2
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=root



#sharding-database
#position表名, database-strategy :按库切分 ,  inline:行表达式格式,  sharding-column:指明分片键
spring.shardingsphere.sharding.tables.position.database-strategy.inline.sharding-column=id

# algorithm-expression:指明表达式什么时候定位到ds0ds1
spring.shardingsphere.sharding.tables.position.database-strategy.inline.algorithm-expression=ds$->{id % 2}

#position_detail的配置
spring.shardingsphere.sharding.tables.position_detail.database-strategy.inline.sharding-column=pid
spring.shardingsphere.sharding.tables.position_detail.database-strategy.inline.algorithm-expression=ds$->{pid % 2}

# 主键生成策略

#指定主键id的字段名  #指定type类型如UUID ,SNOWFLAKE  注意使用jpa中entity的id主键生成需开启
spring.shardingsphere.sharding.tables.position.key-generator.column=id

spring.shardingsphere.sharding.tables.position.key-generator.type=SNOWFLAKE

#spring.shardingsphere.sharding.tables.position.key-generator.type=LAGOUKEY


#position_detail的主键生成策略
spring.shardingsphere.sharding.tables.position_detail.key-generator.column=id
spring.shardingsphere.sharding.tables.position_detail.key-generator.type=SNOWFLAKE


2.2.4 测试类TestShardingDatabase

import javax.annotation.Resource;
import java.util.Date;
import java.util.Random;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = RunBoot.class)
public class TestShardingDatabase {

    @Resource
    private PositionRepository positionRepository;
    @Resource
    private PositionDetailRepository positionDetailRepository;
   
    @Test
    public  void testAdd() {
        for (int i = 1; i <= 20; i++) {
            Position position = new Position();
            position.setName("lagou" + i);
            position.setSalary("10000");
            position.setCity("beijing");
            positionRepository.save(position);

            PositionDetail positionDetail = new PositionDetail();
            positionDetail.setPid(position.getId());
            positionDetail.setDescription("this is a pig" + i);
            positionDetailRepository.save(positionDetail);

        }
    }

}

2.2.5 运行效果

技术分享图片
技术分享图片
技术分享图片
技术分享图片


2.2.6 自定义主键生成策略实现 ShardingKeyGenerator接口即可

package com.lagou.id;

import org.apache.shardingsphere.core.strategy.keygen.SnowflakeShardingKeyGenerator;
import org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator;

import java.util.Properties;

/**
 * 自定义主键生成器 
 */
public class MyLagouId implements ShardingKeyGenerator {

    /**
     * 用同一个主键生成器对象 就会分配均匀
     */
    private  SnowflakeShardingKeyGenerator snowflakeShardingKeyGenerator =  new SnowflakeShardingKeyGenerator();

    /**
     * 返回我们生成的主键值 由于这个算法比较复杂,就还是使用SNOWFLAKE,也可以自己写
     * @return
     */
    @Override
    public Comparable<?> generateKey() {
        System.out.println("---执行了自定义主键生成器MyLagouId");
        return snowflakeShardingKeyGenerator.generateKey();
    }

    /**
     * 返回配置文件中那个的type
     * @return
     */
    @Override
    public String getType() {
        return "LAGOUKEY";
    }

    @Override
    public Properties getProperties() {
        return null;
    }

    @Override
    public void setProperties(Properties properties) {

    }
}

2.2.6.1 修改配置文件并在resources下建一下文件(文件名需一致)

技术分享图片

  • org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator内容如下
com.lagou.id.MyLagouId

  • 注意:resource文件下的目录分级为/

2.2.7修改application-sharding-database.properties的主键生成策略的type为自定义主键生成策略返回的type

spring.shardingsphere.sharding.tables.position.key-generator.type=LAGOUKEY


3.Sharding-JDBC之订单分库分表

Sharding-JDBC 实战

原文:https://www.cnblogs.com/qdmpky/p/13307022.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!