日常分享系列之:学习mysql-binlog-connector-java

news2024/11/14 12:00:53

日常分享系列之:学习mysql-binlog-connector-java

  • 使用
  • 读取二进制日志文件
  • 利用 MySQL 复制流
  • MariaDB
  • 控制事件反序列化
  • 通过 JMX 公开 BinaryLogClient
  • Using SSL
  • 实施说明
  • 常见问题解答
  • 文档
  • BinaryLogFileReader.java

mysql-binlog-connector-java:

  • git hub官方地址

使用

<dependency>
    <groupId>com.zendesk</groupId>
    <artifactId>mysql-binlog-connector-java</artifactId>
    <version>0.25.0</version>
</dependency>

最初,该项目是作为的分支开始的,但最终却成为了一次完全的重写。主要的不同之处/特点包括:

  • 自动的二进制日志文件名/位置 | GTID 解决方案
  • 可恢复的断开连接
  • 可插拔的故障转移策略
  • binlog_checksum=CRC32 支持(适用于 MySQL 5.6.2+ 用户)
  • 通过 TLS 进行安全通信
  • 适用于 JMX
  • 实时统计
  • 可在 Maven Central 上获取
  • 无第三方依赖,测试套件覆盖不同版本的 MySQL 发行版。

读取二进制日志文件

File binlogFile = ...
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
BinaryLogFileReader reader = new BinaryLogFileReader(binlogFile, eventDeserializer);
try {
    for (Event event; (event = reader.readEvent()) != null; ) {
        ...
    }
} finally {
    reader.close();
}

这段代码用于读取二进制日志文件(binlogFile)中的事件,并对事件进行处理。

  • 首先,通过创建BinaryLogFileReader对象,并传入binlogFile和EventDeserializer对象来初始化。BinaryLogFileReader是Debezium库中的类,用于读取二进制日志文件。EventDeserializer是另一个Debezium类,用于反序列化二进制日志中的事件。
  • 接下来,通过调用eventDeserializer的setCompatibilityMode方法,设置事件反序列化的兼容模式。在此例中,将日期和时间以长整型形式表示(DATE_AND_TIME_AS_LONG),将字符和二进制数据以字节数组形式表示(CHAR_AND_BINARY_AS_BYTE_ARRAY)。
  • 然后,通过使用BinaryLogFileReader的readEvent方法,循环读取日志文件中的事件。每次循环读取到一个事件,就可以对该事件进行自定义的处理。
  • 最后,使用finally块确保在读取完毕后关闭BinaryLogFileReader对象,释放资源。
  • 这段代码展示了如何使用Debezium库来读取二进制日志文件,并对其中的事件进行处理。可以根据具体需求在for循环中添加自定义的逻辑来处理读取到的每个事件。

利用 MySQL 复制流

先决条件:无论计划使用哪个用户来访问 BinaryLogClient,他都必须拥有 REPLICATION SLAVE 权限。除非自己指定 binlogFilename/binlogPosition(在这种情况下不会启动自动解析),否则还需要授予 REPLICATION CLIENT 权限。

BinaryLogClient client = new BinaryLogClient("hostname", 3306, "username", "password");
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
client.setEventDeserializer(eventDeserializer);
client.registerEventListener(new EventListener() {

    @Override
    public void onEvent(Event event) {
        ...
    }
});
client.connect();

这段代码用于创建一个BinaryLogClient对象,连接到MySQL数据库,并注册一个事件监听器。

  • 首先,通过创建BinaryLogClient对象,并传入MySQL主机名、端口、用户名和密码来初始化。BinaryLogClient是Debezium库中的类,用于连接到MySQL数据库,并读取其二进制日志中的事件。
  • 接下来,通过创建EventDeserializer对象,设置事件反序列化的兼容模式,并将其设置为BinaryLogClient的事件反序列化器。由于默认情况下,BinaryLogClient使用的事件反序列化器是LegacyEventDeserializer,因此需要将其替换为自定义的eventDeserializer。
  • 然后,通过调用registerEventListener方法,注册一个事件监听器。在此例中,创建了一个匿名内部类实现EventListener接口,并重写了onEvent方法。在onEvent方法中,可以对读取到的事件进行自定义的处理。
  • 最后,通过调用client的connect方法,连接到MySQL数据库并开始读取其二进制日志中的事件。连接成功后,BinaryLogClient将持续读取MySQL二进制日志中的事件,并在每个事件上触发注册的事件监听器。
  • 这段代码展示了如何使用Debezium库创建一个BinaryLogClient对象,连接到MySQL数据库,并注册一个事件监听器来处理其二进制日志中的事件。可以根据具体需求在事件监听器中添加自定义的逻辑来处理读取到的每个事件。

可以使用 client.registerLifecycleListener(…) 注册 onConnect / onCommunicationFailure / onEventDeserializationFailure / onDisconnect 的侦听器。

默认情况下,BinaryLogClient 从当前(连接时)主 binlog 位置启动。如果您希望从特定文件名或位置启动,请使用 client.setBinlogFilename(filename) + client.setBinlogPosition(position)。

client.connect() 是阻塞的(意味着客户端将在当前线程中侦听事件)。另一方面,client.connect(timeout) 会生成一个单独的线程。

MariaDB

原始的BinaryLogClient可以直接与MariaDB配合使用,但有两个区别:

  • 一、MariaDB的GTID(全局事务标识)不同。它们仍然是字符串,但解析方式不同。
  • 二、MariaDB可以发送ANNOTATE_ROWS事件,允许恢复用于生成行的SQL语句(在基于行的复制中)。

请参阅官方文档https://mariadb.com/kb/en/annotate_rows_log_event/ 并使用client.setUseSendAnnotateRowsEvent(true)进行配置。

控制事件反序列化

可能出于多种原因需要进行控制:不想浪费时间反序列化不需要的事件;感兴趣的事件类型没有定义EventDataReader(或者定义了但存在错误);希望以不同的方式反序列化某些类型的事件(例如,*RowsEventData应该包含表名而不是ID);等等。

EventDeserializer eventDeserializer = new EventDeserializer();

// do not deserialize EXT_DELETE_ROWS event data, return it as a byte array
eventDeserializer.setEventDataDeserializer(EventType.EXT_DELETE_ROWS,
    new ByteArrayEventDataDeserializer());

// skip EXT_WRITE_ROWS event data altogether
eventDeserializer.setEventDataDeserializer(EventType.EXT_WRITE_ROWS,
    new NullEventDataDeserializer());

// use custom event data deserializer for EXT_DELETE_ROWS
eventDeserializer.setEventDataDeserializer(EventType.EXT_DELETE_ROWS,
    new EventDataDeserializer() {
        ...
    });

BinaryLogClient client = ...
client.setEventDeserializer(eventDeserializer);

这段代码用于配置事件反序列化器(EventDeserializer)以控制事件数据的反序列化方式。

  • 首先,通过创建EventDeserializer对象来初始化事件反序列化器。
  • 然后,通过调用setEventDataDeserializer方法,为特定类型的事件设置自定义的事件数据反序列化器。在这个例子中,针对EXT_DELETE_ROWS事件类型,使用了一个名为ByteArrayEventDataDeserializer的自定义事件数据反序列化器,它将事件数据返回为字节数组。对于EXT_WRITE_ROWS事件类型,则使用了一个名为NullEventDataDeserializer的自定义事件数据反序列化器,它完全跳过事件数据的反序列化过程,即不进行任何处理。对于EXT_DELETE_ROWS事件类型,使用了一个匿名内部类实现EventDataDeserializer接口的自定义事件数据反序列化器。
  • 接下来,创建一个BinaryLogClient对象,并将上述配置的事件反序列化器设置给它。
  • 通过这段代码,可以根据具体需求,为不同类型的事件设置不同的事件数据反序列化器,以控制事件数据的反序列化方式。可以根据需要选择使用预定义的反序列化器,也可以创建自定义的反序列化器来处理特定类型的事件数据。

通过 JMX 公开 BinaryLogClient

MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();

BinaryLogClient binaryLogClient = ...
ObjectName objectName = new ObjectName("mysql.binlog:type=BinaryLogClient");
mBeanServer.registerMBean(binaryLogClient, objectName);

// following bean accumulates various BinaryLogClient stats
// (e.g. number of disconnects, skipped events)
BinaryLogClientStatistics stats = new BinaryLogClientStatistics(binaryLogClient);
ObjectName statsObjectName = new ObjectName("mysql.binlog:type=BinaryLogClientStatistics");
mBeanServer.registerMBean(stats, statsObjectName);

这段代码用于在Java管理扩展(JMX)中注册BinaryLogClient和BinaryLogClientStatistics的MBean。

  • 首先,通过调用ManagementFactory的getPlatformMBeanServer方法,获取到一个MBeanServer对象。MBeanServer用于注册和管理MBean(管理Bean)。
  • 接下来,创建一个BinaryLogClient对象,并将其以ObjectName的形式注册到MBeanServer中。ObjectName用于唯一标识一个MBean。在此例中,将BinaryLogClient注册到名为"mysql.binlog:type=BinaryLogClient"的ObjectName下。
  • 然后,创建一个BinaryLogClientStatistics对象,并将其以ObjectName的形式注册到MBeanServer中。BinaryLogClientStatistics是一个用于统计BinaryLogClient各种信息(例如断开连接的次数、跳过的事件数等)的类。在此例中,将BinaryLogClientStatistics注册到名为"mysql.binlog:type=BinaryLogClientStatistics"的ObjectName下。
  • 通过这段代码,可以在JMX中注册BinaryLogClient和BinaryLogClientStatistics的MBean,从而可以通过JMX监控和管理BinaryLogClient的运行状态和统计信息。可以使用JMX工具(如JConsole或VisualVM)来查看和操作这些MBean。

Using SSL

TLSv1.1和TLSv1.2需要+。在MySQL 5.7.10之前,MySQL仅支持TLSv1(参见)。要检查MySQL服务器是否支持TLSv1.1和TLSv1.2,可以使用以下命令:mysql -h host -u root -ptypeyourpasswordmaybe -e “show global variables like ‘have_%ssl’;”(“Value"应该是"YES”)。可以使用s命令来确定当前会话的状态("SSL"不应为空)。

System.setProperty("javax.net.ssl.trustStore", "/path/to/truststore.jks");
System.setProperty("javax.net.ssl.trustStorePassword","truststore.password");
System.setProperty("javax.net.ssl.keyStore", "/path/to/keystore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "keystore.password");

BinaryLogClient client = ...
client.setSSLMode(SSLMode.VERIFY_IDENTITY);

实施说明

  • 无论列定义是否包含“unsigned”关键字,数字类型(tinyint 等)的数据始终返回有符号数据(!)。
  • var*/*text/blob 类型的数据始终作为字节数组返回(对于 var,从 1.0.0 开始就是如此)。

常见问题解答

问:典型的事务是什么样子的?
答:如果gtid_mode=ON,则为GTID事件 -‍> 包含"BEGIN"的QUERY事件 -‍> … -‍> XID事件 | 包含"COMMIT"或"ROLLBACK"的QUERY事件。

问:插入/更新/删除行的EventData中没有关于表的信息(除了一些奇怪的id)。我该如何理解它?
答:每个WriteRowsEventData/UpdateRowsEventData/DeleteRowsEventData事件都是由TableMapEventData事件(包含模式和表名)引导的。如果出于某种原因您需要知道列名(类型等)- 最简单的方法是

select TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION, COLUMN_DEFAULT, IS_NULLABLE,
DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE,
CHARACTER_SET_NAME, COLLATION_NAME from INFORMATION_SCHEMA.COLUMNS;
# see https://dev.mysql.com/doc/refman/5.6/en/columns-table.html for more information

这段代码用于查询MySQL数据库中的所有表、列和其相关信息。

  • 通过使用SELECT语句查询INFORMATION_SCHEMA.COLUMNS表,可以获取到所有表、列和其相关信息的详细列表。在此例中,查询结果包括TABLE_SCHEMA(表所在的模式)、TABLE_NAME(表名)、COLUMN_NAME(列名)、ORDINAL_POSITION(列在表中的顺序)、COLUMN_DEFAULT(默认值)、IS_NULLABLE(是否可为NULL)、DATA_TYPE(数据类型)、CHARACTER_MAXIMUM_LENGTH(字符型列的最大长度)、CHARACTER_OCTET_LENGTH(二进制型列的最大长度)、NUMERIC_PRECISION(数值型列的精度)、NUMERIC_SCALE(数值型列的小数位数)、CHARACTER_SET_NAME(字符集名称)和COLLATION_NAME(排序规则名称)。
  • 同时,注释中提供了一个链接,可以查看更多关于INFORMATION_SCHEMA.COLUMNS表的详细信息。
  • 通过这段代码,可以方便地查询MySQL数据库中的所有表、列和其相关信息,并根据需要对其进行进一步处理和分析。

文档

API概述

  • 有两个入口点 - BinaryLogClient(用于从MySQL服务器读取二进制日志)和BinaryLogFileReader(用于离线日志处理)。它们都依赖于EventDeserializer来反序列化事件流。每个事件由EventHeader(包含对EventType的引用等信息)和EventData组成。上述的EventDeserializer有一个EventHeaderDeserializer(默认为EventHeaderV4Deserializer)和一组EventDataDeserializer。如果没有为某种特定类型的事件注册EventDataDeserializer,将使用默认的EventDataDeserializer(NullEventDataDeserializer)。

MySQL内部手册

  • 要了解MySQL内部的详细信息,请参考这里https://dev.mysql.com/doc/dev/mysql-server/latest/。其中的MySQL Client/Server Protocol和The Binary Log部分对于**.binlog.network和**.binlog.event包的参考文档非常有用。

BinaryLogFileReader.java

/*
 * Copyright 2013 Stanley Shyiko
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.github.shyiko.mysql.binlog;

import com.github.shyiko.mysql.binlog.event.Event;
import com.github.shyiko.mysql.binlog.event.deserialization.EventDeserializer;
import com.github.shyiko.mysql.binlog.io.ByteArrayInputStream;

import java.io.BufferedInputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;

/**
 * MySQL binary log file reader.
 *
 * @author <a href="mailto:stanley.shyiko@gmail.com">Stanley Shyiko</a>
 */
public class BinaryLogFileReader implements Closeable {

    public static final byte[] MAGIC_HEADER = new byte[]{(byte) 0xfe, (byte) 0x62, (byte) 0x69, (byte) 0x6e};

    private final ByteArrayInputStream inputStream;
    private final EventDeserializer eventDeserializer;

    public BinaryLogFileReader(File file) throws IOException {
        this(file, new EventDeserializer());
    }

    public BinaryLogFileReader(File file, EventDeserializer eventDeserializer) throws IOException {
        this(file != null ? new BufferedInputStream(new FileInputStream(file)) : null, eventDeserializer);
    }

    public BinaryLogFileReader(InputStream inputStream) throws IOException {
        this(inputStream, new EventDeserializer());
    }

    public BinaryLogFileReader(InputStream inputStream, EventDeserializer eventDeserializer) throws IOException {
        if (inputStream == null) {
            throw new IllegalArgumentException("Input stream cannot be NULL");
        }
        if (eventDeserializer == null) {
            throw new IllegalArgumentException("Event deserializer cannot be NULL");
        }
        this.inputStream = new ByteArrayInputStream(inputStream);
        try {
            byte[] magicHeader = this.inputStream.read(MAGIC_HEADER.length);
            if (!Arrays.equals(magicHeader, MAGIC_HEADER)) {
                throw new IOException("Not a valid binary log");
            }
        } catch (IOException e) {
            try {
                this.inputStream.close();
            } catch (IOException ex) {
                // ignore
            }
            throw e;
        }
        this.eventDeserializer = eventDeserializer;
    }

    /**
     * @return deserialized event or null in case of end-of-stream
     */
    public Event readEvent() throws IOException {
        return eventDeserializer.nextEvent(inputStream);
    }

    @Override
    public void close() throws IOException {
        inputStream.close();
    }

}

这段代码是一个MySQL二进制日志文件读取器。

  • 首先,代码中包含了版权信息和Apache许可证。
  • 然后,导入了需要使用的类,包括Event、EventDeserializer、ByteArrayInputStream和Closeable等。
  • 接下来,定义了一个名为BinaryLogFileReader的类。该类实现了Closeable接口,表示它可以被关闭。
  • 在类中定义了一个名为MAGIC_HEADER的字节数组,用于验证二进制日志文件的有效性。
  • 构造函数BinaryLogFileReader接受一个File参数,并创建一个ByteArrayInputStream对象作为输入流。然后,通过读取输入流的前几个字节,验证二进制日志文件的有效性。如果验证失败,抛出IOException异常。否则,将输入流和事件反序列化器传递给BinaryLogFileReader对象。
  • readEvent方法用于读取二进制日志文件中的事件,并通过事件反序列化器将其反序列化为Event对象。如果到达文件末尾,返回null。
  • 最后,实现了close方法,用于关闭输入流。
  • 通过这段代码,可以创建一个BinaryLogFileReader对象,用于读取MySQL二进制日志文件,并逐个解析其中的事件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2238970.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能座舱多屏项目,中控屏切换语言,后排屏闪黑屏问题

1. 背景 智能座舱多屏项目&#xff0c;中控屏切换语言&#xff0c;后排屏闪黑屏问题 2. 详细分析过程 通过events log查看activity的生命周期&#xff1a;adb shell logcat -b events com.android.rwhvac.view.behind.BehindActivity2 : displayId 2 副屏app com.android.…

多商户中英双语电商系统设计与开发 PHP+mysql

随着全球电商市场的扩展&#xff0c;多商户平台成为了越来越多商家参与全球贸易的重要方式。为了适应不同语言用户的需求&#xff0c;尤其是中英双语用户的需求&#xff0c;设计一个支持中英双语的电商系统显得尤为重要。本文将重点探讨如何设计一个多商户中英双语电商系统&…

Ansys Zemax | 手机镜头设计 - 第 4 部分:用LS-DYNA进行冲击性能分析

该系列文章将讨论智能手机镜头模组设计的挑战&#xff0c;从概念和设计到制造和结构变形分析。本文是四部分系列中的第四部分&#xff0c;它涵盖了相机镜头的显式动态模拟&#xff0c;以及对光学性能的影响。使用Ansys Mechanical和LS-DYNA对相机在地板上的一系列冲击和弹跳过程…

【JavaEE初阶】多线程上部

文章目录 本篇目标&#xff1a;一、认识线程&#xff08;Thread&#xff09;1.概念&#xff1a;2.创建线程 二、Thread 类及常见方法2.1 Thread 的常见构造方法2.2 Thread 的几个常见属性2.3 启动⼀个线程 - start()2.4 中断⼀个线程2.5 等待⼀个线程 - join()2.6 获取当前线程…

丹摩征文活动|智谱AI引领是实现文本可视化 - CogVideoX-2b 部署与使用

文章目录 前言一、DAMODEL平台特性二、创建CPU云实例三、CogVedioX介绍四、DAMODEL一键部署CogVideoX1. 创建丹摩实例(参考上述介绍)2. 配置环境和依赖3. 模拟与配置文件4. 开始运行4.1 调试4.2 webUI4.3 端口映射 前言 DAMODEL&#xff08;丹摩智算&#xff09;是一款专为满足…

MySQL的知识巩固

目录 三大范式 第一范式: 第二范式: 第三范式: 巴斯-科德范式(BCNF): 反范式&#xff1a; MySQL的工作原理 三大范式 第一范式: 一个字段只表明一个事情 优点: 数据一致性&#xff1a; 在1NF中&#xff0c;由于每个属性都是原子的&#xff0c;因此避免了在一个属性中存…

越野车TV 1.0.5337 | TV端越野赛车游戏,解锁无限金币

越野车TV是一款专为电视设计的越野赛车游戏&#xff0c;最初是安卓手机端的游戏&#xff0c;现已移植到TV端并兼容遥控器操作。这款游戏的特点是解锁了VIP&#xff0c;所有资源都可以免费使用。游戏采用3D横版卡通风格&#xff0c;提供真实的越野赛车体验。玩家可以在崎岖的赛道…

MySQL 迁移 dm

参考链接 此处为语雀内容卡片&#xff0c;点击链接查看&#xff1a;MySQL 5.7.27 迁移 DM 8 语雀 迁移前准备 以下中的命名&#xff0c;密码都是可修改的&#xff0c;这里给出的就只是一个例子 创建表空间 # 创建表空间名为 dbTest&#xff0c;路径为 Z:\fei\data\dm\dbT…

信息安全工程师(82)操作系统安全概述

一、操作系统安全的概念 操作系统安全是指操作系统在基本功能的基础上增加了安全机制与措施&#xff0c;从而满足安全策略要求&#xff0c;具有相应的安全功能&#xff0c;并符合特定的安全标准。在一定约束条件下&#xff0c;操作系统安全能够抵御常见的网络安全威胁&#xff…

从0开始学习Linux——文件管理

往期目录&#xff1a; 从0开始学习Linux——简介&安装 从0开始学习Linux——搭建属于自己的Linux虚拟机 从0开始学习Linux——文本编辑器 从0开始学习Linux——Yum工具 从0开始学习Linux——远程连接工具 从0开始学习Linux——文件目录 从0开始学习Linux——网络配置 从0开…

vue中调用全屏方法、 elementUI弹框在全屏模式下不出现问题、多级嵌套弹框蒙层遮挡问题等处理与实现方案

全屏模式下弹框不展示的原因是elementUI的弹框我们让他挂在body中了&#xff0c;而我们全屏的div盒子不是整个文档&#xff0c;这时候就找不到弹框了。 当我们把弹框改为插入到父元素上 这时候会出现蒙层盖住整个页面&#xff0c;什么也点不了的问题。 这是elementUI官方的一个…

特征检测与特征匹配方法笔记+代码分享

在一幅图像中&#xff0c;总能发现其独特的像素点&#xff0c;这些点可以被视为该图像的特征&#xff0c;我们称之为特征点。在计算机视觉领域中&#xff0c;基于特征点的图像特征匹配是一项至关重要的任务&#xff0c;因此&#xff0c;如何定义并识别一幅图像中的特征点显得尤…

补: 力扣145 : 二叉树的后序遍历

天才的回归 ---- 二叉树的后序遍历 描述&#xff1a; **给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 ** 示例&#xff1a; 解法&#xff1a;递归就不说了&#xff0c;看下遍历法&#xff0c;与先序和中序略有不同 简单来说注意两个点&#xff1a; 1&…

Centos8 安装 JDK / Python / MySQL / Redis / Nginx

安装 JDK 华为镜像 JDK 下载地址&#xff1a;https://repo.huaweicloud.com:8443/artifactory/java-local/jdk/ 这里安装 JDK8 为例&#xff1a; # 这里直接通过 wget 下载 wget https://repo.huaweicloud.com:8443/artifactory/java-local/jdk/8u202-b08/jdk-8u202-linux-x…

使用轻易云平台高效集成聚水潭与南网订单数据

高效实现聚水潭与南网供应商对接的数据集成方案 普通发货对接南网供应商配送通知接口 在现代数据集成项目中&#xff0c;如何高效、可靠地实现不同系统之间的数据对接是一个关键挑战。本文将聚焦于一个实际案例&#xff1a;将聚水潭平台的数据集成到南方电网商城平台&#xff…

【经验分享】一招解决VMware虚拟机存储空间越来越大的问题

【经验分享】一招解决VMware虚拟机硬盘空间越来越大的问题 前言一、解决办法二、补充说明 前言 在使用虚拟机过程中&#xff0c;会出现用着用着虚拟机硬盘占用空间越来越大的问题。即使删除了文件&#xff0c;依然会占用宿主机的硬盘空间。如果虚拟机一开始分配的硬盘空间过大…

使用Element UI实现一个拖拽图片上传,并可以Ctrl + V获取图片实现文件上传

要在 Element UI 的拖拽上传组件中实现 Ctrl V 图片上传功能&#xff0c;可以通过监听键盘事件来捕获粘贴操作&#xff0c;并将粘贴的图片数据上传到服务器。 版本V1&#xff0c;实现获取粘贴板中的文件 注意&#xff0c;本案例需要再你已经安装了Element UI并在项目中正确配…

Ascend Extension for PyTorch是个what?

1 Ascend Extension for PyTorch Ascend Extension for PyTorch 插件是基于昇腾的深度学习适配框架&#xff0c;使昇腾NPU可以支持PyTorch框架&#xff0c;为PyTorch框架的使用者提供昇腾AI处理器的超强算力。 项目源码地址请参见Ascend/Pytorch。 昇腾为基于昇腾处理器和软…

strtok_s详解,实现使用strtok_s分割字符串,并返回包含分割符的子串

1.strtok_s函数原型 strtok_s 是一个线程安全的字符串分割函数&#xff0c;它是 strtok 的一个变体&#xff0c;用于将字符串分割成一系列的标记&#xff08;tokens&#xff09;。与 strtok 不同&#xff0c;strtok_s 需要一个额外的参数来保存上下文信息&#xff0c;这样它就…

Docker--Docker是什么和对Docker的了解

Docker 的本质 Docker的本质是LXC&#xff08;Linux容器&#xff09;之类的增强版&#xff0c;它本身不是容器&#xff0c;而是容器的易用工具。 Docker通过虚拟化技术&#xff0c;将代码、依赖项和运行环境打包成一个容器&#xff0c;并利用隔离机制来使得容器之间互相独立、…