Springboot整合shardingsphere-jdbc的5.2.0版本实现分库分表

单位让切shardingsphere5.2.0的版本,该版本和之前版本在配置上还是有些区别的,特记录一下Springboot整合shardingsphere-jdbc的5.2.0版本。

之前使用的是5.0.0版本,只需配置spring.shardingsphere.rules.sharding.default-database-strategy.standard.sharding-algorithm-name=默认分库算法类全限定名,spring.shardingsphere.rules.sharding.tables.user.table-strategy.standard.sharding-algorithm-name=分表算法类全限定名。而5.2.0版本sharding-algorithm-name属性后配置的是分库分表算法的别名。新增了type属性,如果是自定义类分片算法的话该属性值为CLASS_BASED。并且需要配置两个属性,分别是props.strategy(配置分片策略类型)、props.algorithmClassName(配置分片算法全限定名)。见下图。

 

下面以两库十表为例,其中dbm为主库,db1、db2用于分库分表。user表分库分表,student表不分库分表。自定义精准分片策略,以user_id的倒数第一位数字对库数取模作为具体库,user_id的倒数第二三位数字对表数取模作为具体表。详细配置如下。

一、引入依赖

添加相关依赖,数据源连接池使用默认的HikariCP。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.13</version>
</dependency>

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
    <version>5.2.0</version>
</dependency>

二、自定义分片策略

5.2.0版本实现自定义分片策略需要实现StandardShardingAlgorithm接口,除了支持精准分片策略,还支持范围分片策略。下面只以精准分片策略为例:

1、自定义分库策略

package com.shardingsphere.test.config.datasource.precise;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;
import org.springframework.beans.factory.annotation.Value;

import java.util.Collection;
import java.util.Iterator;
import java.util.Properties;

/**
 * @description sharding jdbc 精准 `分库` 策略
 **/
@Slf4j
public class PreciseShardingDatabaseAlgorithm implements StandardShardingAlgorithm<String> {

    // 主库别名
    private static final String DBM = "dbm";

    private static int dataBaseSize;

    @Value("${dataBaseSize}")
    public void setDataBaseSize(int size) {
        dataBaseSize = size;
    }

    /**
     * @description: 分库策略,按用户编号最后一位数字对数据库数量取模
     *
     * @param dbNames 所有库名
     * @param preciseShardingValue 精确分片值,包括(columnName,logicTableName,value)
     * @return 表名
     */
    @Override
    public String doSharding(Collection<String> dbNames, PreciseShardingValue<String> preciseShardingValue) {
        log.info("Database PreciseShardingAlgorithm dbNames:{} ,preciseShardingValue: {}.", JSON.toJSONString(dbNames),
                JSON.toJSONString(preciseShardingValue));

        // 若走主库,直接返回主库
        if (dbNames.size() == 1) {
            Iterator<String> iterator = dbNames.iterator();
            String dbName = iterator.next();
            if (DBM.equals(dbName)) {
                return DBM;
            }
        }

        // 按数据库数量取模
        String num = StringUtils.substring(preciseShardingValue.getValue(), -1);
        int mod = Integer.parseInt(num) % dataBaseSize;
        for (String dbName : dbNames) {
            // 分库的规则
            if (dbName.endsWith(String.valueOf(mod))) {
                return dbName;
            }
        }
        throw new UnsupportedOperationException();
    }

    @Override
    public Collection<String> doSharding(Collection<String> collection, RangeShardingValue<String> rangeShardingValue) {
        return null;
    }

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

    @Override
    public void init(Properties properties) {

    }
}

2、自定义分表策略

package com.shardingsphere.test.config.datasource.precise;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;
import org.springframework.beans.factory.annotation.Value;

import java.util.Collection;
import java.util.Properties;

/**
 * @description sharding jdbc 精准`分表`策略
 **/
@Slf4j
public class PreciseShardingTableAlgorithm implements StandardShardingAlgorithm<String> {

    // 分表数量
    private static int tableSize;

    @Value("${tableSize}")
    public void setTableSize(int size) {
        tableSize = size;
    }

    /**
     * @description: 分表策略,按用户编号倒数二三位数字对数据库表数量取模
     *
     * @param tableNames 所有表名
     * @param preciseShardingValue 精确分片值,包括(columnName,logicTableName,value)
     * @return 表名
     */
    @Override
    public String doSharding(Collection<String> tableNames, PreciseShardingValue<String> preciseShardingValue) {

        log.info("Table PreciseShardingAlgorithm tableNames:{} ,preciseShardingValue: {}.",
                JSON.toJSONString(tableNames), JSON.toJSONString(preciseShardingValue));
        // 按表数量取模
        // 截取用户编号倒数二三位数字,(如1234的倒数二三位为23)
        String num = StringUtils.substring(preciseShardingValue.getValue(), -3, -1);
        int mod = Integer.parseInt(num) % tableSize;
        for (String tableName : tableNames) {
            // 分表的规则
            if (tableName.endsWith(String.valueOf(mod))) {
                return tableName;
            }
        }
        throw new UnsupportedOperationException();
    }

    @Override
    public Collection<String> doSharding(Collection<String> collection, RangeShardingValue<String> rangeShardingValue) {
        return null;
    }

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

    @Override
    public void init(Properties properties) {

    }
}

三、数据库相关配置

配置数据库相关配置,其中库表的分片策略使用上面我们自定义的分片策略。这里相较于5.0.0的版本改动不大。

# 数据源参数配置
initialSize=5
minIdle=5
maxIdle=100
maxActive=20
maxWait=60000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
# Sharding Jdbc配置
# 分库的数量(注意:需要排除主库)
dataBaseSize=2
# 分表的数量
tableSize=10
# dbm为主库,db0,db1
spring.shardingsphere.datasource.names=dbm,db0,db1
# 配置主库
spring.shardingsphere.datasource.dbm.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.dbm.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.dbm.jdbc-url=
spring.shardingsphere.datasource.dbm.username=
spring.shardingsphere.datasource.dbm.password=
spring.shardingsphere.datasource.dbm.initialSize=${initialSize}
spring.shardingsphere.datasource.dbm.minIdle=${minIdle}
spring.shardingsphere.datasource.dbm.maxActive=${maxActive}
spring.shardingsphere.datasource.dbm.maxWait=${maxWait}
spring.shardingsphere.datasource.dbm.validationQuery=SELECT 1 FROM DUAL
spring.shardingsphere.datasource.dbm.timeBetweenEvictionRunsMillis=${timeBetweenEvictionRunsMillis}
spring.shardingsphere.datasource.dbm.minEvictableIdleTimeMillis=${minEvictableIdleTimeMillis}
# 配置db0
spring.shardingsphere.datasource.db0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.db0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.db0.jdbc-url=
spring.shardingsphere.datasource.db0.username=
spring.shardingsphere.datasource.db0.password=
spring.shardingsphere.datasource.db0.initialSize=${initialSize}
spring.shardingsphere.datasource.db0.minIdle=${minIdle}
spring.shardingsphere.datasource.db0.maxActive=${maxActive}
spring.shardingsphere.datasource.db0.maxWait=${maxWait}
spring.shardingsphere.datasource.db0.validationQuery=SELECT 1 FROM DUAL
spring.shardingsphere.datasource.db0.timeBetweenEvictionRunsMillis=${timeBetweenEvictionRunsMillis}
spring.shardingsphere.datasource.db0.minEvictableIdleTimeMillis=${minEvictableIdleTimeMillis}
# 配置db1
spring.shardingsphere.datasource.db1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.db1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.db1.jdbc-url=
spring.shardingsphere.datasource.db1.username=
spring.shardingsphere.datasource.db1.password=
spring.shardingsphere.datasource.db1.initialSize=${initialSize}
spring.shardingsphere.datasource.db1.minIdle=${minIdle}
spring.shardingsphere.datasource.db1.maxActive=${maxActive}
spring.shardingsphere.datasource.db1.maxWait=${maxWait}
spring.shardingsphere.datasource.db1.validationQuery=SELECT 1 FROM DUAL
spring.shardingsphere.datasource.db1.timeBetweenEvictionRunsMillis=${timeBetweenEvictionRunsMillis}
spring.shardingsphere.datasource.db1.minEvictableIdleTimeMillis=${minEvictableIdleTimeMillis}

# 分库配置,默认分库策略
spring.shardingsphere.rules.sharding.default-database-strategy.standard.sharding-column=user_id
spring.shardingsphere.rules.sharding.default-database-strategy.standard.sharding-algorithm-name=database-precise-sharding

# 分表配置

# user表配置
spring.shardingsphere.rules.sharding.tables.user.actual-data-nodes=db$->{0..1}.user_$->{0..9}
spring.shardingsphere.rules.sharding.tables.user.table-strategy.standard.sharding-column=user_id
spring.shardingsphere.rules.sharding.tables.user.table-strategy.standard.sharding-algorithm-name=table-precise-sharding

# 分库分表算法属性配置
spring.shardingsphere.rules.sharding.sharding-algorithms.database-precise-sharding.type=CLASS_BASED
spring.shardingsphere.rules.sharding.sharding-algorithms.database-precise-sharding.props.strategy=STANDARD
spring.shardingsphere.rules.sharding.sharding-algorithms.database-precise-sharding.props.algorithmClassName=com.shardingsphere.test.config.datasource.precise.PreciseShardingDatabaseAlgorithm
spring.shardingsphere.rules.sharding.sharding-algorithms.table-precise-sharding.type=CLASS_BASED
spring.shardingsphere.rules.sharding.sharding-algorithms.table-precise-sharding.props.strategy=STANDARD
spring.shardingsphere.rules.sharding.sharding-algorithms.table-precise-sharding.props.algorithmClassName=com.shardingsphere.test.config.datasource.precise.PreciseShardingTableAlgorithm

# 不分库分表配置规则
# student
spring.shardingsphere.rules.sharding.tables.student.actual-data-nodes=dbm.student
spring.shardingsphere.rules.sharding.tables.student.table-strategy.inline.sharding-column=id
spring.shardingsphere.rules.sharding.tables.student.table-strategy.inline.algorithm-expression=student
# 打印分库分表日志
spring.shardingsphere.props.sql-show=true

四、加载数据库相关配置

package com.shardingsphere.test.config.datasource;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

/**
 * @Ddescription DataSourceConfig
 **/
@Configuration
@PropertySource(value = {"${config.path}/db.properties"})
public class DataSourceConfig {
}

配置文件目录如下 ,

config.path属性配置在pom文件中。

完成以上三步后即可将sharding-jdbc版本升级到5.2.0版本。

### 回答1: poi-ooxml-5.2.0-javadoc.jar是Apache POI项目的一部分,它是一个Java库,用于处理Microsoft Office文档的读写操作。具体来说,poi-ooxml-5.2.0-javadoc.jar主要处理Office Open XML(OOXML)格式的文档,这是Microsoft Office 2007及以后版本默认使用的文档格式。 这个jar文件是POI的API文档,提供了POI库中各个类、方法和属性的详细说明和使用示例。它是通过使用Javadoc工具自动生成的,是为了方便开发人员阅读、理解和使用POI库的一个重要资源。 使用poi-ooxml-5.2.0-javadoc.jar,开发者可以快速了解POI库的功能和用法,它详细说明了POI库中各个类和方法的作用和用法,包括如何读取和写入Excel、Word和PowerPoint文档,如何处理图表、样式、格式和公式等等。开发者可以通过查看API文档来了解POI库提供的各种功能,并且可以根据需要调用适当的类和方法来处理特定的Office文档。 通过阅读poi-ooxml-5.2.0-javadoc.jar文档,开发者可以更好地理解和应用POI库,提高开发效率和质量。通过遵循API文档中的建议和示例,开发者可以写出更稳健、灵活和高性能的代码,从而更好地处理和操作Office文档。 ### 回答2: poi-ooxml-5.2.0-javadoc.jar是一种Java文档文件,属于poi-ooxml库的一部分。poi-ooxml是一个用于操作Microsoft Office文件的Java库,能够读取、写入和操作Word、Excel和PowerPoint等Office文件。该库提供了一组API,使开发者能够轻松地创建、修改和读取这些文件。 poi-ooxml-5.2.0-javadoc.jar是用于提供API文档的文件。在Java开发中,API文档对于理解和使用库中的函数非常重要。该文档提供了关于poi-ooxml库中所有类、方法和属性的详细描述。使用这个文档,开发者可以快速了解库中的函数用途和使用方法,从而更高效地进行开发。 通过查阅poi-ooxml-5.2.0-javadoc.jar文件,开发者可以找到所需类和函数的详细说明,包括函数的输入参数、返回值和使用示例。此外,文档还提供了对类、接口和常量的详细描述,帮助开发者理解整个库的组织结构和使用规则。 总之,poi-ooxml-5.2.0-javadoc.jar是poi-ooxml库的API文档文件,提供了关于该库中类、方法和属性的详细说明,为开发者提供了在Java开发中使用poi-ooxml库的指南和参考。 ### 回答3: poi-ooxml-5.2.0-javadoc.jar是Apache POI项目的一部分,它提供了对OOXML(Office Open XML)文件格式的支持。OOXML是一种开放的文件格式,用于存储和处理办公文档,如Microsoft Office中的文档(如.docx、.xlsx和.pptx)等。 poi-ooxml-5.2.0-javadoc.jar是带有javadoc的JAR文件,其中包含了对Apache POI项目中的OOXML模块的详细文档和说明。javadoc是一种自动生成的文档,用于描述Java代码的功能、方法、参数和返回值等详细信息。使用javadoc可以帮助开发人员更好地理解和使用Apache POI的OOXML模块。 通过查阅poi-ooxml-5.2.0-javadoc.jar中的文档,开发人员可以了解如何使用Apache POI的OOXML模块来读取、创建和修改OOXML格式的办公文档。文档提供了对各个类、方法和参数的详细说明,介绍了模块的整体架构和关键功能。开发人员可以根据文档中的示例代码和指导来编写自己的应用程序,实现对OOXML文档的操作。 poi-ooxml-5.2.0-javadoc.jar的存在使得开发人员可以方便地查阅和学习Apache POI的OOXML模块,提升开发效率和质量。通过合理利用这个JAR文件中的文档,开发人员能够更好地理解OOXML格式和Apache POI API的使用方法,从而更好地开发出符合自己需求的办公文档处理应用。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffylv

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值