我们在开发项目的时候,会遇到有一个或者几个表的数据量特别大的情况。比如商城中的订单表。这个是随着时间的推进越来越多。所以需要进行分表来处理。让单表的数量不要太多。所以这个时候需要进行分表操作。我们使用比较流行的shardingsphere来实现。

一:引入jar包

 <!--shardingsphere start-->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-namespace</artifactId>
            <version>4.1.1</version>
        </dependency>

二:在application.properties中设置


# 数据源 master (当前只有一个)
spring.shardingsphere.datasource.names=master
# 数据源 主库
spring.shardingsphere.datasource.master.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.master.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.master.url=jdbc:mysql://localhost:3306/db0?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.shardingsphere.datasource.master.username=root
spring.shardingsphere.datasource.master.password=




###分表策略 其中user为逻辑表 分表主要取决于id行
spring.shardingsphere.sharding.tables.user.actual-data-nodes=master.user_$->{0..1}
spring.shardingsphere.sharding.tables.user.key-generator.column=id
spring.shardingsphere.sharding.tables.user.key-generator.type=SNOWFLAKE


### 行表达式分片策略  begin (如果没有下面的这两行。user_0和user_1都会存相同的数据) ###
# 根据这个列分表
spring.shardingsphere.sharding.tables.user.table-strategy.inline.sharding-column=id
# 分表规则为:对 asset_package_id 取模
spring.shardingsphere.sharding.tables.user.table-strategy.inline.algorithm-expression=user_$->{id % 2}
### 行表达式分片策略  end###


# 绑定表规则列表, 多个用逗号隔开
spring.shardingsphere.sharding.binding-tables[0]=user
#spring.shardingsphere.sharding.binding-tables[1]=test


#打印sql
spring.shardingsphere.props.sql.show=true

三:创建表

CREATE TABLE `user_0` (
  `id` bigint(32) NOT NULL,
  `name` varchar(10) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;



CREATE TABLE `user_1` (
  `id` bigint(32) NOT NULL,
  `name` varchar(10) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

注意:

1:这两个表名要根据application.properties中的设置一样。

spring.shardingsphere.sharding.tables.user.actual-data-nodes=master.user_$->{0..1}

2:由于生成的id是雪花算法。所以id应该要足够大,用bigint(32)就足够了

spring.shardingsphere.sharding.tables.user.key-generator.column=id
spring.shardingsphere.sharding.tables.user.key-generator.type=SNOWFLAKE

四:实现功能

按照一般的方式dao,service,controller实现创建。

entity

public class User implements Serializable {
    private long id;

    private String name;

    private Integer age;

    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 == null ? null : name.trim();
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

mapper


public interface UserMapper {
  

    int insert(User record);



    List<User> selectByExample(UserExample example);

}

xml

 <insert id="insert" parameterType="com.zhm.entity.User">
    insert into user (name, age)
    values ( #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER})
  </insert>

特别注意:当insert的时候id千万不要写。否则会一直是0。

service


@Service
public class TestService {

    @Resource
    private UserMapper userMapper;

    @Transactional
    public Result add(String name) {
        try {
            User user=new User();
            user.setName(name);
            user.setAge(12);
            userMapper.insert(user);
            return Result.sendSuccess("新增成功");
        } catch (Exception e) {
            e.printStackTrace();
            return Result.sendFailure("新增失败");
        }

    }

    public Result query() {

        UserExample example=new UserExample();
        UserExample.Criteria crt=example.createCriteria();
        List<User> list= userMapper.selectByExample(example);
        return Result.sendSuccess("查询成功",list);
    }
}

controller

@RestController
@RequestMapping(value = "/test")
public class TestController {

    @Resource
    private TestService testService;

    @RequestMapping(value = "/add", method = RequestMethod.GET)
    public Result add(@RequestParam(value = "name") String name) {
        return testService.add(name);
    }
    @RequestMapping(value = "/query", method = RequestMethod.GET)
    public Result query() {
        return testService.query();
    }


}

可能出现问题:

shardingjdbc insert时报错Sharding value must implements Comparable

参考:

springboot 整合 Shardingsphere 4.0 分库分表

Sharding-JDBC 中的分片策略

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐