DataX-Mysql主键UUID类型切分主键

datax导数优化之splitPk优化 既上篇说过通过splitPk的方式将一个sql查询分成多个,进行并行查询可以大幅度的提高导数速度。 例如一张表 id name score id单调递增, name是 aaa->zzz score是1->100 这种事完美数据,无论取哪个都会拆分的很均匀 但是生活中的数据千奇百怪。。。。有时候会发现splitPk速度确实有提升,但是还是很慢? 那怎么办呢? 例如 height name score 数据1000w height=168-172 这个区间占了900w其余的分布在.. 阅读详情

一、问题背景

之前公司在使用datax时,需要从rds同步数据到hive,但是数据库中的主键id是uuid类型的字符串,使用datax默认的字符串分隔方式,其实会有很大的问题,所以官方也不推荐使用。

二. 分析源码

跟踪底层源码最终可以定位到这个RangeSplitUtil类上

public static String[] doAsciiStringSplit(String left, String right, int expectSliceNumber) {
        int radix = 128;

        BigInteger[] tempResult = doBigIntegerSplit(stringToBigInteger(left, radix),
                stringToBigInteger(right, radix), expectSliceNumber);
        String[] result = new String[tempResult.length];

        //处理第一个字符串(因为:在转换为数字,再还原的时候,如果首字符刚好是 basic,则不知道应该添加多少个 basic)
        result[0] = left;
        result[tempResult.length - 1] = right;

        for (int i = 1, len = tempResult.length - 1; i < len; i++) {
            result[i] = bigIntegerToString(tempResult[i], radix);
        }

        return result;
}

    /**
     * 由于只支持 ascii 码对应字符,所以radix 范围为[1,128]
     */
    public static BigInteger stringToBigInteger(String aString, int radix) {
        if (null == aString) {
            throw new IllegalArgumentException("参数 bigInteger 不能为空.");
        }

        checkIfBetweenRange(radix, 1, 128);

        BigInteger result = BigInteger.ZERO;
        BigInteger radixBigInteger = BigInteger.valueOf(radix);

        int tempChar;
        int k = 0;

        for (int i = aString.length() - 1; i >= 0; i--) {
            tempChar = aString.charAt(i);
            if (tempChar >= 128) {
                throw new IllegalArgumentException(String.format("根据字符串进行切分时仅支持 ASCII 字符串,而字符串:[%s]非 ASCII 字符串.", aString));
            }
            result = result.add(BigInteger.valueOf(tempChar).multiply(radixBigInteger.pow(k)));
            k++;
        }

        return result;
    }

    /**
     * 把BigInteger 转换为 String.注意:radix 和 basic 范围都为[1,128], radix + basic 的范围也必须在[1,128].
     */
    private static String bigIntegerToString(BigInteger bigInteger, int radix) {
        if (null == bigInteger) {
            throw new IllegalArgumentException("参数 bigInteger 不能为空.");
        }

        checkIfBetweenRange(radix, 1, 128);

        StringBuilder resultStringBuilder = new StringBuilder();

        List<Integer> list = new ArrayList<Integer>();
        BigInteger radixBigInteger = BigInteger.valueOf(radix);
        BigInteger currentValue = bigInteger;

        BigInteger quotient = currentValue.divide(radixBigInteger);
        while (quotient.compareTo(BigInteger.ZERO) > 0) {
            list.add(currentValue.remainder(radixBigInteger).intValue());
            currentValue = currentValue.divide(radixBigInteger);
            quotient = currentValue;
        }
        Collections.reverse(list);

        if (list.isEmpty()) {
            list.add(0, bigInteger.remainder(radixBigInteger).intValue());
        }

        Map<Integer, Character> map = new HashMap<Integer, Character>();
        for (int i = 0; i < radix; i++) {
            map.put(i, (char) (i));
        }

//        String msg = String.format("%s 转为 %s 进制,结果为:%s", bigInteger.longValue(), radix, list);
//        System.out.println(msg);

        for (Integer aList : list) {
            resultStringBuilder.append(map.get(aList));
        }

        return resultStringBuilder.toString();
    }

看过源码之后其实可以很清楚的了解到它的思路

  1. stringToBigInteger方法:主键id最小值-left,主键id最大值-right,将字符串整体看做一个128进制数(根据ascii码位数),依次将每个字符的数值乘以对应位置n的128的n次方,累加求和。最终可以得到2个bigint值,将这两个当做区间的左右边界
  2. bigIntegerToString:根据需要切分的个数,求出步长 step =(right-left)/ splitnum , 求出切分点 (left + step + 1),并将切分点重新按照步骤1的方式,反向除128求出每位对应的acsii码对应的字符,拼接起来组成一个新的字符串
  3. 拼接sql,  切点1 <= splitkey < 切点2 and ...

 

但这里有一个很严重的问题,我们都知道UUID的字符串其实是只有字母,数字和中划线组成的,但是当你将一个UUID的字符串转成int时,加上一个步长,重新除128计算出来的ascii码并不是刚好落在字母,数字和中划线上,这就导致你计算出来的切割点的字符串id并不是一个标准的UUID字符串,而是一个乱码的字符串,如下所示:

可以自己尝试一下
doAsciiStringSplit("0122ed89-adb0-4599-84b7-89cfeb544637","8d89bb48-b290-4d92-a9af-80b3f8bfc036", 5)

返回的分隔点结果为:

0122ed89-adb0-4599-84b7-89cfeb544637

:eLVA[\u001E(-b('\u0006z\u001Ai\u000EtG\rN%@G\u00048sw(X4W\u001A\u000Bp\u0003

E\u0019fz\u001DR\u0004\u0017-bkk]G\u0001\u001Cd/`bghI`P8\u0004\u0007kN3y\u007Fa,O

ON\u0001\u001DyHj\u0006-c/04\u0013gP9jz8\u0001+Rz\u001C7\u0014\u0018.D3\u001Ce6i\u001A

Z\u0002\u001BAU?Ou-cru\n`N\u0004\u000F&\u0014\r\u001An\\\u0013h6$(q:2?K\f%e

8d89bb48-b290-4d92-a9af-80b3f8bfc036

这样的分隔点,使用mysql语句去做查询的结果肯定是有问题的。因为我们知道mysql的字符排序与其设置的字符排序集有关,但如果按照ascii码大小排序来说,他这个切分的结果也是不准确的, '0'  <  ':' < 'E' < 'O' < 'Z' > '8' ,实际在数据库排序集utf8mb4_general_ci下的结果是 ':' < '0' < '8' < 'E' < 'O' < 'Z',因此使用原生切分后的切点作为范围去查询,在这个例子中就会出现有些task没有数据,有些task分到了全部的数据 ;肯定也会存在部分切点范围有交集的情况,就会多读数据,存在重复数据。

三. 改造源码

其实datax本身的思路没有什么问题,就是没有考虑到这个ascii码反向转换后的问题,因此我基于这个思路,改造了一下他的源码。

主要想法:UUID其实去掉中划线之后,是一个32位的16进制数(主要由0-9,a-f构成);而数据库中0-9,a-z的排序结果是一定的,即0<9<a<z

1、将原先的left和right去掉中划线后,转换为16进制数

2、求步长,求出切点大小

3、将计算后的切点的十六进制整数转为字符串,并按照UUID格式在相应的位置上加上中划线

 

public static String[] doUUIDStringSplit(String left, String right, int expectSliceNumber) {
        BigInteger leftInteger = new BigInteger(left.replace("-", ""), 16);
        BigInteger rightInteger = new BigInteger(right.replace("-", ""), 16);
        BigInteger[] tempResult = doBigIntegerSplit(leftInteger, rightInteger, expectSliceNumber);
        String[] result = new String[tempResult.length];

        result[0] = left;
        result[tempResult.length - 1] = right;

        for (int i = 1, len = tempResult.length - 1; i < len; i++) {
            result[i] = bigIntegerToString(tempResult[i]);
        }

        return result;
 }


private static String bigIntegerToString(BigInteger bigInteger) {
        String hex = bigInteger.toString(16);
        List<String> list = new ArrayList<>();
        Pattern pattern = Pattern.compile("([a-z0-9]{8})([a-z0-9]{4})([a-z0-9]{4})([a-z0-9]{4})([a-z0-9]{12})");
        Matcher matcher = pattern.matcher(hex);
        List<String> list = new ArrayList<>();
        if (matcher.matches()){
            for (int i = 1; i <=matcher.groupCount(); i++){
                list.add(matcher.group(i));
            }
        }
        return StringUtils.join(list, "-");
}

 

查看切分之后的结果

取一个范围跨度大的例子:
doUUIDStringSplit("0122ed89-adb0-4599-84b7-89cfeb544637","d65e165d-d69a-47da-b41e-4549401b0ab0", 5)


切分后的结果:
0122ed89-adb0-4599-84b7-89cfeb544637

2bc85c1a-82ab-dfa6-8e32-7c1b62af3a50

566dcaab-57a7-79b3-97ad-6e66da0a2e68

8113393c-2ca3-13c0-a128-60b251652280

abb8a7cd-019e-adcd-aaa3-52fdc8c01698

d65e165d-d69a-47da-b41e-4549401b0ab0

四、大数据量测试

首先准备一个测试表,多线程生成UUID入库,根据改良后的字符串分割进行计算切点

数据总数:

min(id), max(id):

取5个分片,生成切分点:

('0000049e-8bda-4111-a06e-c25f42403f57' <= id AND id < '333336ba-a3b7-dacb-9a1b-4fef4f6ed44e')
('333336ba-a3b7-dacb-9a1b-4fef4f6ed44e' <= id AND id < '666668d6-bb95-7485-93c7-dd7f5c9d6945')
('666668d6-bb95-7485-93c7-dd7f5c9d6945' <= id AND id < '99999af2-d373-0e3f-8d74-6b0f69cbfe3b')
('99999af2-d373-0e3f-8d74-6b0f69cbfe3b' <= id AND id < 'cccccd0e-eb50-a7f9-8720-f89f76fa9331')
('cccccd0e-eb50-a7f9-8720-f89f76fa9331' <= id AND id <= 'ffffff2b-032e-41b3-80cd-862f84292827')

分别count数量:

切点范围切点1切点2切点3切点4切点5
count16026831604252160353816021211607406

最后将每个cout数量累加计算,可得和实际的数据量大小相等。

五、总结

这种方式其实也不是特别的完美,分隔的后每个task分到的数据也不一定会很均衡尤其在数据量不大的情况下,在数据量大的情况下会分布均匀一些,但是至少克服了原先字符串分隔会出现的,重复读数据或者少读数据的情况。

如果真的想要做到每个task分布均匀的话,就需要借助自己去实现mysql的rownum函数,以及具体代码实现,这里提供一些思路

1、求出left,right对应的rownum
2、计算步长,以及切点对应的rownum
3、根据切点对应的rownum去数据库查询对应步长的id

SELECT id from
(
SELECT 
@rownum:=@rownum+1 AS rownum, 
t.id
FROM 
(SELECT @rownum:=0) r, 
(SELECT id from table order by id asc) t
) a where a.rownum = {切点的rownum}

 

datax优化之reader提速-详细经历 首先说明下,个人认为reader提速最重要的一点就是切分任务即split这块 背景:一直用datax从oracle到hive数据,一般是1w-2w条/s也凑合用了,但是最近导DM_F_REV_FULL_LIFE_CYCLE_IMS表 该表根据月在hive分区,每个分区数据在200w-1000w左右,数据量也不算特别大但是速度只有4M/s 速度不到7000条/s, { "job":{ "setting":{ "speed":{ "c 阅读详情

相关推荐

Datax 数据同步-使用总结(二)

这部分主要记录 datax 实现增量同步的方案。

a80C51的博客 3124

datax使用说明

分割任务由reader执行,对于mysqlReader,由CommonRdbmsReader的split方法执行。taskNumber = channel/tableNumber * splitFactor(默认5) +1。2、任务运行时间有上限,不需要配置很大的channel就能达到这个上限,具体数值可以通过测试得出。结论:1、只有配置了splitKey才会开启并行任务。1、使用splitKey切分主键。taskNumber(代码计算)channel(配置)使用splitKey。time(测试得出)

jimiao_xxxx的博客 1044

2024年最全DataX - 全量数据同步工具_datax工具,大数据开发视频开发面试问题

【代码】2024年最全DataX - 全量数据同步工具_datax工具,大数据开发视频开发面试问题。

2401_84170337的博客 1315

datax的架构原理

datax的架构图 我们会预先确定好:channel的数量,factor 数量,切分主键,每个taskGroup的最大channel数量 engine是一个主线程,会根据reader设置切分的规则对读取任务进行切分成多个task,writertask的数量会和reader task数量保持一致,我们姑且理解这个为 task对。 然后他会根据我们确定好的channel数量去确定taskGroup的数量,例如 taskGroup的实际数量 = channel数/单个task的最大channel数。 ...

qq_31277531的博客 2112

DataX进阶:揭秘querySql、preSql、postSql与splitPk的实战场景与避坑指南

本文深入解析DataX中querySql、preSql、postSql与splitPk的实战应用与避坑技巧。通过电商订单同步、数据清洗等场景,详解如何利用querySql处理复杂查询,preSql/postSql实现数据预处理与后处理,以及splitPk提升同步效率。特别提醒配置互斥、性能优化等关键注意事项,助你高效完成数据同步任务。

weixin_42528191的博客 292

DataX同步MySQL到ClickHouse,我踩过的那些坑和性能调优实战

本文详细介绍了使用DataX将MySQL数据同步到ClickHouse的实战经验,包括并行度设置、类型映射问题解决和大数据量同步的性能优化。通过科学的参数配置和避坑指南,帮助开发者提升数据同步效率,避免常见陷阱,实现性能提升300%的优化效果。

weixin_42614269的博客 335

06-mysql切分

Mysql切分 数据切分 关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。 数据库分布式核心内容无非就是数据切分(Sharding),以及切分后对数据的定位、整合。数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数

liaoqing1999的博客 505

数据库进阶实战:从死锁排查到国产数据库适配的完整指南

数据库是软件系统数据一致性与高可用的基石,索引、锁与事务共同决定了并发场景下的稳定表现。在理解基础原理后,工程实践中的死锁定位、唯一约束冲突处理及数据库同步工具选型往往更具挑战。随着实时数仓与AI应用普及,基于binlog的同步方案与向量数据库也成为后端开发绕不开的话题。面向Java技术栈,掌握从主从复制到增量订阅、从相似度检索到国产数据库迁移适配的完整路径,能显著提升系统设计与排障能力。围绕这些实战场景,系统梳理面试考察点与线上踩坑经验,有助于建立从原理到落地的知识闭环。

weixin_34268843的博客 370

Datax-web入门配置与启动

在idea中启动Datax-web需要先将Datax在本地安装,可以参考这篇文章(DataX在win10中的安装)GitHub - WeiYe-Jing/datax-web: DataX集成可视化页面,选择数据源即可一键生成数据同步任务,支持RDBMS、Hive、HBase、ClickHouse、MongoDB等数据源,批量创建RDBMS数据同步任务,集成开源调度系统,支持分布式、增量同步数据、实时查看运行日志、监控执行器资源、KILL运行进程、数据源信息加密等。 增加几行代码 下面的代码可以直接覆盖

西楼的博客 5180

从零构建中华古诗词数据库:表结构设计、SQL优化与向量检索实战

数据库设计是数据管理的核心基础,而关系型数据库的建模与查询优化直接决定了应用系统的性能与扩展性。从实体关系模型到范式化拆分,再到索引策略与SQL执行计划,每一步都影响着数据存储与检索的效率。在实际工程中,无论是处理CSV导入、解决中文乱码,还是通过连接池提升并发能力,这些技术都构成了数据库运维与开发的必备技能。随着AI时代到来,向量数据库与RAG技术的引入,更让传统文本数据具备了语义检索能力,为知识图谱与智能问答提供了新的可能。本文以中华古诗词数据库的完整构建过程为例,从表结构设计、数据清洗,到SQL实战、

weixin_30800807的博客 418

FOC项目知识点总结三 | 完全搞懂 Clarke 与 Park 变换(附动图,仿真文件以及详细讲解数学推导过程)

本文目的,最终可以完整推算两种变换 Clarke 变换 首先先看我们需要用到的两种坐标系 1. 自然坐标系 abcabcabc 我们知道,通过三相逆变电路,我们可以画出一个自然坐标系 abcabcabc ,即三相电压的坐标系,通入的电流在这三轴坐标系中变化: 将三个矢量相加合并在一起就如下图所展现: 使用三个坐标轴来表示十分的麻烦与不直观,因为其是非正交的,于是乎我们想要将其转化成使用两个正交的坐标轴来表示,于是乎便有了 Clarke变换。 Clarke 变换的作用: 将基于三轴二维的定子静止坐标系的各

Wilson Huang的博客 3万+

mysql字段uuid_mysql插入数据自动生成主键uuid

DemoMapper.java//注意方法的返回值必须是void;void add(Demo demo);==============================================demoMapper.xml:selectreplace(uuid(),'-','')INSERT INTOdb_demo(demo_id,name,age)VALUES(#{demoId},#{na...

weixin_39616222的博客 1252

Linux 系统管理员必备:Chrome 企业版离线部署全攻略(含 RPM/DEB 双版本)

本文详细介绍了Linux系统管理员如何离线部署Chrome企业版,涵盖RPM和DEB双版本。从获取官方离线安装包到静默安装、权限配置及企业级策略管理,提供全流程解决方案,特别适合Ubuntu等DEB系系统管理员参考。

f9g0h的博客 483

DataX-Web 源码调试及打包

DataX-Web 源码打包。

程序员大佬超的博客 4845

【暂时完结】Prescan学习笔记

Prescan学习记录1. Prescan基础知识1.1 Conventions·坐标1.2 Road segment·道路片段1.2.1 让一个路段连接其他两个路段1.2.2 配置车道线1.2.3 Road marking·道路标志1.3 Trajectory·轨迹1.3.1 建立一个Path·路径1.3.2 配置Speedprofile1.3.3 Synchronization of Trajectories·轨迹同步1.3.4 Multiple trajectories · 多轨迹分配 1. Pres

dreautumn的博客 1万+

28、解码清华SSVEP基准数据集:从EEG信号到深度学习模型的实战指南

本文详细解析了清华大学SSVEP基准数据集的处理与深度学习模型构建全流程。从EEG信号预处理、数据维度变换到SSVEP分类模型设计,提供了实战代码示例和关键技巧,帮助读者掌握脑机接口领域的数据处理方法与模型优化策略。

weixin_29029995的博客 176

盘点dataxweb数据迁移中遇到的坑

因项目数据迁移需要,结合实际情况,选择使用了datax进行数据迁移,盘点datax遇到的坑

qq_34193086的博客 920

centos7下100T存储扩容(LVM)至150T

查看新增磁盘情况lsblk,fdisk -l [root@localhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 4.2G 0 rom vda 252:0 0 80G 0 disk ├─vda1 252:1 0 1G 0 part /boot └─vda2 252:2

tiyager的博客 1025

datax-web构建自己的中台

1、下载datax 2、下载datax-web-master 3、idea打开datax-web-master,maven自动下载包(三小时,好漫长) 4、传经mysql的库datax,创建用户datax 密码datax,导入db下的sql F:\datax\datax-web-master\bin\db\datax_web.sql 5、修改配置文件,修改src下的 F:\datax\datax-web-master\datax-admin\src\main\resources\applica.

viviliving的专栏 1950

从Safety Manual到系统安全概念

本文系统阐述了构建功能安全"证据链"的工程化方法论,核心要点包括:1)建立"风险→对策→验证→证据"闭环链条;2)SafetyManual和FMEDA作为关键证据支撑点,前者界定系统安全边界,后者量化诊断覆盖率;3)通过四步法继承芯片安全机制并扩展至系统级;4)形成"设计-分析-验证"三维闭环体系,包括安全目标、技术实现和验证矩阵;5)强调证据链闭环对安全认证和OEM认可的重要性。该方法论实现了从理论要求到工程实践的完整转化,确保安全设计可验证、可

VehSwHwDeveloper的博客 721

DC Error: The power pin VDD on the cell UASA1/CG_X8_Rdsd2pcm is unconnected. (UPF-581)

【代码】DC Error: The power pin VDD on the cell UASA1/CG_X8_Rdsd2pcm is unconnected. (UPF-581)

baidu_34971492的博客 969

Sqoop安装配置与数据迁移实战:从MySQL到Hadoop生态

数据迁移是构建企业数据仓库和ETL流程中的基础环节,其核心原理在于实现异构数据源之间的高效、稳定传输。在Hadoop生态中,Sqoop作为一款专为结构化数据库与HDFS/Hive之间批量数据同步设计的工具,凭借其与Hadoop原生集成的技术优势,成为数据工程师处理传统关系型数据库与大数据平台间数据搬运的经典选择。通过MapReduce作业并行化处理,Sqoop能显著提升海量数据迁移效率,广泛应用于数据仓库构建、历史数据归档和系统间数据交换等场景。本文聚焦Sqoop 1.4.7的实战部署,针对MySQL到Ha

weixin_33895657的博客 346

STM32入门教程:WiFi通信

第四步:初始化串口 在生成的代码中,您可以找到一个名为 "USARTx_Init" 的函数,其中 "x" 是您选择的串口号。然后,我们使用 "AT+CIPSEND" 命令发送UDP数据,接收到服务器的回复,并在终端上显示收到的数据。在配置向导中,您可以选择启用USART串口功能,并根据您的硬件连接,将串口设置为与WiFi模块连接的串口。在上述代码中,我们使用了 "HAL_UART_Receive" 函数来接收串口数据,并使用 printf 来在终端上显示收到的数据。如果有任何问题,请随时向我提问。

2401_85258012的博客 1073

MySQL分库分表实战:从核心原理到ShardingSphere-JDBC实现

数据库水平扩展是应对海量数据和高并发场景的核心技术。其基本原理是通过数据分片,将集中式的数据存储与访问压力分散到多个物理节点,从而突破单机在IO、CPU和连接数上的瓶颈,实现系统吞吐量的线性提升和查询延迟的降低。这项技术对于构建高性能、高可用的互联网应用具有关键价值,广泛应用于电商、社交、金融等需要处理大规模用户数据的业务场景。本文聚焦于MySQL分库分表这一具体实践,深入剖析了其背后的技术原理,并详细演示了如何借助ShardingSphere-JDBC这一主流中间件,从零开始实现一个完整的、可落地的分库分

congsikuai0611的博客 351

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

数据库笔试核心考点解析:从增删改查到索引优化与事务原理

数据库是现代应用系统的核心基础设施,掌握其底层原理是每一位开发者和运维人员的必备技能。从最基础的增删改查操作出发,深入理解事务的ACID特性、隔离级别与MVCC机制,才能应对并发场景下的死锁与数据一致性问题。索引优化是提升查询性能的关键,通过B+树结构与执行计划分析,能够有效避免全表扫描和回表开销。数据库设计中的范式权衡与主键策略,直接影响系统的扩展性与稳定性。在实际业务中,数据库同步工具和国产数据库的迁移适配,已成为企业数字化转型的重要课题。本文结合浩鲸科技2020届数据库笔试真题,系统梳理这些高频考点的

weixin_34235457的博客 425

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Apache ShardingSphere分库分表实战:从设计到上线的避坑指南

数据分片(Sharding)是应对海量数据增长的核心分布式技术,其原理是通过水平拆分将数据分布到多个数据库节点,从而突破单机容量与性能瓶颈。这项技术为高并发、大数据量场景提供了可扩展的解决方案,在电商、金融等互联网领域应用广泛。实践中,分片键设计、算法选择及SQL兼容性是关键挑战。本文基于一线实战经验,深入解析Apache ShardingSphere在分库分表场景下的配置策略与性能优化技巧,涵盖复合分片键、分布式主键、绑定表等核心机制,并针对分页查询、多表关联等复杂场景提供解决方案。通过分享真实项目中遇到

397

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: RMI原理浅析以及调用流程
下一篇: SpringBoot整合Activiti7
Shadow_Light
博客等级 码龄11年 24粉丝 13原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值