首页 > 其他分享 >Sharding-JDBC标准模式详解

Sharding-JDBC标准模式详解

时间:2024-10-16 19:21:41浏览次数:9  
标签:JDBC shardingsphere 配置 模式 sharding 详解 spring Sharding 分片

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

标签:JDBC,shardingsphere,配置,模式,sharding,详解,spring,Sharding,分片
From: https://blog.csdn.net/xiugtt6141121/article/details/142987972

相关文章

  • 【Golang】Go 语言中的 time 包详解:全面掌握时间处理与应用
    在Go语言中,time包提供了强大的时间处理功能,适用于各种场景:获取当前时间、格式化和解析时间、计算时间间隔、设置定时器、处理超时等。在开发过程中,熟练掌握time包能够帮助我们轻松处理时间相关的操作,尤其是定时任务、超时控制等非常常见的功能。文章目录一、`time.......
  • 强大灵活的文件上传库:FilePond 详解
    文件上传是Web开发中常见的功能,尤其是对于图片、视频、文档等大文件的处理,如何既保证用户体验,又兼顾安全和性能,是每位开发者关心的问题。在这样的背景下,FilePond作为一款灵活强大的文件上传库,逐渐在前端开发者中脱颖而出。FilePond提供了优雅的用户界面和全面的功能,同时兼容多......
  • Vulhub Bob: 1.0.1靶机详解
    项目地址https://download.vulnhub.com/bob/Bob_v1.0.1.ova实验过程开启靶机虚拟机使用nmap进行主机发现,获取靶机IP地址nmap192.168.47.1-254根据对比可知Bob:1.0.1的一个ip地址为192.168.47.173扫描Bob:1.0.1的操作系统,端口及对应服务nmap-A-p-192.168.......
  • 【数据结构】时间、空间复杂度详解
    大家有没有遇到过,为什么有些程序跑得飞快,而有些程序却慢得让人抓狂?我们可能都是这样认为的:他写的程序效率高等等,确实如此。但这背后隐藏着两个重要的概念:时间复杂度和空间复杂度。它们就像程序的“效率指标”,帮助我们评估程序的性能。一、时间复杂度:衡量速度的尺子简单来说,时......
  • (接上篇问题回答)OWASP Top 10 漏洞详解:基础知识、面试常问问题与实际应用
    1.SQL注入面试常见问题什么是SQL注入? SQL注入是一种网络安全漏洞,攻击者通过向SQL查询插入恶意代码,来干扰应用程序的数据库查询,导致未授权的数据访问或数据操纵。如何防止SQL注入? 防止SQL注入的方法包括:使用预编译的SQL语句(PreparedStatements)。使用ORM工具。严格验证和......
  • [整理]C#反射(Reflection)详解
    [整理]C#反射(Reflection)详解本人理解:装配件:Assembly(程序集)晚绑定:后期绑定MSDN:反射(C#编程指南)-----------------原文如下--------1、什么是反射2、命名空间与装配件的关系3、运行期得到类型信息有什么用4、如何使用反射获取类型5、如何根据类型来动态创建对象6、......
  • 前端新手教程:HTML、CSS 和 JavaScript 全面详解及实用案例
    一、引言在当今数字化的时代,前端开发扮演着至关重要的角色,它决定了用户与网页和应用程序交互的体验。HTML、CSS和JavaScript作为前端开发的核心技术,分别负责网页的结构、样式和交互。本教程将为前端新手全面深入地介绍HTML、CSS和JavaScript的知识点,并通过实用案例帮助......
  • Nuxt.js 应用中的 modules:done 事件钩子详解
    title:Nuxt.js应用中的modules:done事件钩子详解date:2024/10/16updated:2024/10/16author:cmdragonexcerpt:modules:done是Nuxt.js中一个重要的生命周期钩子,在Nuxt应用初始化期间触发。该钩子允许开发者在用户定义的模块安装完成后执行特定操作,如初始化后续配......
  • 《纪元1800》遭遇dll丢失问题无法启动:msvcr71.dll丢失详解与定制化解决方案
    《纪元1800》是一款非常受欢迎的城市建设和经济策略游戏,但有时玩家可能会遇到msvcr71.dll丢失的问题,导致游戏无法启动。msvcr71.dll是MicrosoftVisualC++运行库的一部分,负责支持许多应用程序的运行。以下是对msvcr71.dll丢失问题的详细解释及定制化解决方案。问题原......
  • Exchange2016服务详解
    Exchange2016服务详解 服务作用问题现象MicrosoftExchangeActiveDirectory拓扑实现AD身份验证用户Outlook邮箱可能需要多次输入密码                                ......