当前位置: 首页 > article >正文

Sharding-JDBC标准模式详解

Sharding-JDBC标准模式详解

一. 为什么要使用标准模式?

Sharding-JDBC的标准模式就配置而言比inline模式繁琐多了, 那为什么要使用标准模式呢

Sharding-JDBC作为Apache ShardingSphere生态中的一款轻量级Java框架,提供了数据分片、读写分离、分布式事务和数据库治理等核心功能。在Sharding-JDBC中,标准模式和inline模式是两种不同的配置方式,它们各有特点。关于Sharding-JDBC标准模式比inline模式好的方面,可以从以下几个维度进行分析:

一、配置复杂性与灵活性

  • 标准模式:通常提供更丰富、更灵活的配置选项。它支持复杂的分片策略、多种数据源配置以及细粒度的控制。标准模式允许开发者根据业务需求进行详细的定制,包括分片键的选择、分片算法的实现以及数据源的管理等。
  • inline模式:通过Groovy表达式简化分片规则的配置,使得分片策略的配置更加简洁、直观。然而,这种简洁性也带来了一定的局限性,即它可能不支持某些复杂的分片策略或需要额外的配置来实现某些功能。

二、性能与扩展性

  • 标准模式:由于提供了更全面的配置选项和更灵活的分片策略,标准模式在性能优化和扩展性方面通常具有更大的潜力。开发者可以根据实际需求对分片策略进行微调,以充分利用数据库的计算和存储能力。
  • inline模式:虽然配置简单,但在处理大规模数据或复杂查询时,其性能可能受到一定限制。此外,由于inline模式的分片策略是预定义的,因此在面对业务变化时可能需要更多的调整工作。

三、可读性与维护性

  • 标准模式:配置文件通常较为详细和复杂,这在一定程度上增加了可读性和维护性的难度。然而,通过合理的组织和管理配置文件,以及使用版本控制系统等工具,可以有效地降低这种难度。
  • inline模式:配置简洁明了,易于理解和维护。然而,对于不熟悉Groovy表达式或Sharding-JDBC的开发者来说,可能需要一定的学习成本来理解和修改配置。

四、适用场景

  • 标准模式:适用于需要高度定制化和灵活性的场景,如大型分布式系统、复杂业务逻辑等。在这些场景中,开发者需要充分利用Sharding-JDBC提供的各种功能来优化性能和扩展性。
  • inline模式:适用于分片规则较为简单且固定的场景,如小型应用、测试环境等。在这些场景中,开发者更注重配置的简洁性和易用性,而不太关注复杂的分片策略或性能优化。

综上所述,Sharding-JDBC标准模式相比inline模式在配置复杂性与灵活性、性能与扩展性方面更具优势。然而,在选择使用哪种模式时,还需要根据具体的业务需求和场景进行权衡。如果业务逻辑相对简单且固定,inline模式可能是一个更好的选择;而如果业务逻辑复杂且需要高度定制化,则标准模式可能更适合。

二. 如何使用?

sharding-JDbc的配置无非分为一下几步

# 1. 配置数据源
# 2. 配置逻辑表数据节点
# 3. 配置分库策略
# 4. 配置分表策略
# 5. 其他配置完善

1. 配置数据源

# 数据源名称,多数据源以逗号分隔
spring.shardingsphere.datasource.names=ds1,ds2
# 数据库连接池类名称
spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
# 数据库驱动类名
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据库 url 连接
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://192.168.188.130:3306/order_db_1?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai
# 数据库用户名
spring.shardingsphere.datasource.ds1.username=root
# 数据库密码
spring.shardingsphere.datasource.ds1.password=root

# 数据库连接池类名称
spring.shardingsphere.datasource.ds2.type=com.alibaba.druid.pool.DruidDataSource
# 数据库驱动类名
spring.shardingsphere.datasource.ds2.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据库 url 连接
spring.shardingsphere.datasource.ds2.url=jdbc:mysql://192.168.188.130:3306/order_db_2?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai
# 数据库用户名
spring.shardingsphere.datasource.ds2.username=root
# 数据库密码
spring.shardingsphere.datasource.ds2.password=root

2. 配置逻辑表数据节点

# 由数据源名 + 表名组成,以小数点分隔。多个表以逗号分隔,支持 inline 表达式。
spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=ds$->{1..2}.t_order_$->{1..2}

3. 配置分库策略

在标准模式下的分库分表配置会相对麻烦

#分片列名称
spring.shardingsphere.sharding.tables.<logic-table-name>.database-strategy.standard.sharding-column= 
#精确分片算法类名称,用于=和IN。该类需实现PreciseShardingAlgorithm接口并提供无参数的构造器
spring.shardingsphere.sharding.tables.<logic-table-name>.database-strategy.standard.precise-algorithm-class-name= 
#范围分片算法类名称,用于BETWEEN,可选。该类需实现RangeShardingAlgorithm接口并提供无参数的构造器
spring.shardingsphere.sharding.tables.<logic-table-name>.database-strategy.standard.range-algorithm-class-name= 

实现接口

package com.jixu.stock.sharding;

import com.google.common.collect.Range;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingValue;
import org.joda.time.DateTime;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @program: stock_parent
 * @description:
 * @author: jixu
 * @create: 2024-10-15 22:37
 **/

public class Alg4DB implements PreciseShardingAlgorithm<Date> , RangeShardingAlgorithm<Date> {

    // 配置
    @Override
    public String doSharding(Collection<String> collection, PreciseShardingValue<Date> preciseShardingValue) {
        // getValue --> 获取sql语句中的查询条件
        Date value = preciseShardingValue.getValue();
        // getColumnName --> 获取判断的列名
        String columnName = preciseShardingValue.getColumnName();
        // getLogicTableName --> 获取逻辑表名
        String logicTableName = preciseShardingValue.getLogicTableName();

        // 获取当前年份
        String year = new DateTime(value).getYear() + "";

        // 设置过滤条件
        Optional<String> msg = collection.stream().filter(item -> item.endsWith(year)).findFirst();
        if (msg.isPresent()){
            return msg.get();
        }

        return "";
    }

    @Override
    public Collection<String> doSharding(Collection<String> collection, RangeShardingValue<Date> rangeShardingValue) {
        Range<Date> valueRange = rangeShardingValue.getValueRange();
        if (valueRange.hasLowerBound()){
            Date date = valueRange.lowerEndpoint();
            int startYear = new DateTime(date).getYear();

            collection = collection.stream().filter(item -> Integer.valueOf(item.substring(item.lastIndexOf("-") + 1)) >= startYear).collect(Collectors.toList());

        }

        if (valueRange.hasUpperBound()){
            Date date = valueRange.upperEndpoint();
            int endYear = new DateTime(date).getYear();
            collection = collection.stream().filter(item -> Integer.valueOf(item.substring(item.lastIndexOf("-") + 1)) <= endYear).collect(Collectors.toList());

        }

        return collection;
    }
}

4. 配置分表策略

spring.shardingsphere.sharding.tables.stock_rt_info.table-strategy.standard.sharding-column= cur_time
spring.shardingsphere.sharding.tables.stock_rt_info.table-strategy.standard.precise-algorithm-class-name=${common.sharding4db}
spring.shardingsphere.sharding.tables.stock_rt_info.table-strategy.standard.range-algorithm-class-name=${common.sharding4db}

5. 其他配置

# 5. 其他配置

# 5.1 配置默认数据源
spring.shardingsphere.sharding.default-data-source-name=defultdb

# 5.2 配置显示sql
spring.shardingsphere.props.sql.show=true

# 5.3 配置广播表
spring.shardingsphere.sharding.broadcast-tables=stock_business

http://www.kler.cn/news/350623.html

相关文章:

  • Openpyxl--学习记录
  • 在C及其他语言里运行shell命令的一点心得
  • LVGL第二篇-组件创建与显示(以slider为例)
  • 高边坡稳定安全监测预警系统解决方案
  • 排查PHP服务器CPU占用率高的问题
  • 电脑篇——Windows设置文件夹只读功能(高级篇)
  • Java基础:面向对象编程5
  • 恢复已删除文件的 10 种安卓数据恢复工具
  • IRP默认最小流程
  • 2023年“网络建设与运维”广西省赛试题复盘
  • yakit使用教程(四,信息收集)
  • WorkFlow GO-Task 源码分析
  • 简单说说mysql中一条读sql是如何执行的
  • 2023年12月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答案 + 解析
  • PowerShell中conda activate指令无效的问题
  • CentOS硬解码+ffmpeg+Nvidia硬解码
  • 探索人工智能在数学教育上的应用——使用大规模语言模型解决数学问题的潜力和挑战
  • 学习 Python 的途径
  • 基于深度学习的车辆车型检测识别系统(YOLOV5)
  • 太速科技-456-FMCJ456-14bit 2通道3/2.6/2GS/s ADC +16bit 2通道12.6GS/s DAC FMC AD/DA子卡
  • WSL2配置代理解决git网络不通畅的问题
  • React Native学习计划
  • STM32—WDG看门狗
  • Palo Alto Networks Expedition 未授权SQL注入漏洞复现(CVE-2024-9465)
  • 基于Spring Boot的大创项目成本控制系统
  • 使用rabbitmq-operator在k8s集群上部署rabbitmq实例