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

用OMS进行 OceanBase 租户间数据迁移的测评

基本概念

OceanBase迁移服务(,简称OMS),可以让用户在同构或异构 RDBMS 与OceanBase 数据库之间进行数据交互,支持数据的在线迁移,以及实时增量同步的复制功能。

OMS 提供了可视化的集中管控平台,通过简单的配置用户即可完成数据的实时迁移,且对源数据库和业务系统的影响开销可忽略不计。OMS 旨在帮助用户以最低的风险、极小的开销和最高的效率实现同构/异构数据库向 OceanBase 数据库进行实时数据迁移和数据同步。OMS 社区版支持数据迁移功能,您可以通过该功能实时进行 MySQL 数据库与 OceanBase 社区版之间的数据迁移,以及 OceanBase 社区版与 OceanBase 社区版之间的数据迁移。

同时,通过 OMS 用户可以在不停服的情况下无缝将数据迁移到 OceanBase 数据库上。在业务应用切换数据库到 OceanBase 数据库前,OMS 可以启用反向数据同步链路,再执行应用切换到 OceanBase 数据库,重新建立主备关系,此时所有在切换后发生在 OceanBase 数据库上的数据变更都将实时同步至切换前的源端数据库,以此来应对紧急回切的需求场景,最大程度的降低业务迁移风险,助力企业用户构建高可用和高可靠的数据体系架构。

测试目的

本节主要测试 OceanBase 数据库不同租户之间的数据同步。当迁移的源端数据库为 OceanBase 时,会通过 OCP 获取相关信息,所以需要关联 OCP。OMS 社区版会通过 JDBC 直连 OCP 的元信息库,来查询数据迁移流程中需要使用的信息,然后发送数据给目标端 OceanBase 租户。该方法同样也适用于 MySQL 与 OceanBase 以及 OceanBase 与 OceanBase 之间的数据同步。

前提条件

1、 已部署 OCP 社区版 3.3.0,详细操作请参见 OCP 部署指南。

2、 已部署 OMS 社区版 3.3.0,详细操作请参见 OMS 部署指南。

3、部署待迁移的 OceanBase 集群(含 OBProxy),必须使用 OCP 接管或创建。详细操作请参见 创建集群 和 使用 OCP 接管 OBD 部署的集群。

数据同步测试

环境准备

1、登录 OCP,使用 OCP 为待迁移的集群创建租户、数据库及迁移所用的用户。具体操作请参见:管理租户。

租户数据库用户备注
test1test_oms_1oms源端1
test2test_oms_2oms源端2
test3test_oms_3oms目标端

2、登录 OMS 社区版控制台。

3、关联 OCP。

当 OMS 社区版的运行涉及 OceanBase 数据源时,会通过 OCP 获取相关信息,所以需要关联 OCP。具体操作请参见 关联 OCP。添加完成后,可在关联 OCP 页面中看到已关联的 OCP。

1679474663

4、添加 OceanBase 社区版数据源(源端和目标端),具体操作请参见 添加 OceanBase-CE 数据源,添加完成后可在数据源管理中看到已添加的数据源列表。

1679474683

测试一:

测试目的:测试能否正常将租户 test1 表 t1 的数据和租户 test2 表 t2 的数据,分别迁移至租户 test3 的表 t1 和 表 t2 中。

测试步骤:

  • 全量迁移:在 OMS 社区版中创建两个迁移项目,将源端租户 test1 和租户 test2 的全量数据迁移至目标端租户 test3 中。
  • 增量同步:在源端租户 test1 的表 t1 和租户 test2 的表 t2 中进行 insertdeleteupdate,查看目标端租户 test3 的表 t1 和 表 t2 数据的变化。
  • 反向增量同步:正常增量同步完成后,开启租户 test3 到 租户 test1 的反向增量同步。在目标端租户 test3 的表 t1 中进行 insertdeleteupdate,查看源端租户 test1 的表 t1 数据的变化。
租户数据库用户备注
test1test_oms_1omst1源端1
test2test_oms_2omst2源端2
test3test_oms_3omst1,t2目标端

1、在客户端使用 oms 用户分别登录租户 test1 和 test2,创建表 t1 和 t2。

obclient -hxxx.xxx.xxx.xxx -P2883 -uoms@test1#testoms -pXXX -A test_oms_1CREATE TABLE `t1` (
`id` int NOT NULL,
`name` varchar(45) DEFAULT NULL,
`remark` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) CHARSET=utf8mb4;MySQL [test_oms_1]> insert into t1(id,name,remark) values(10,'aa','test10');
MySQL [test_oms_1]> insert into t1(id,name,remark) values(11,'bb','test11');
MySQL [test_oms_1]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test10 |
| 11 | bb   | test11 |
+----+------+--------+
2 rows in set (0.002 sec)
obclient -hxxx.xxx.xxx.xxx -P2883 -uoms@test2#testoms -pXXX -A test_oms_2CREATE TABLE `t2` (
`id` int NOT NULL,
`name` varchar(45) DEFAULT NULL,
`remark` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) CHARSET=utf8mb4;MySQL [test_oms_2]> insert into t2(id,name,remark) values(20,'aa','test20');
MySQL [test_oms_2]> insert into t2(id,name,remark) values(21,'bb','test21');
Query OK, 1 row affected (0.002 sec)MySQL [test_oms_2]> select * from t2;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 20 | aa   | test20 |
| 21 | bb   | test21 |
+----+------+--------+
2 rows in set (0.002 sec)

2、创建数据迁移项目,具体操作请参见 数据迁移

2.1、选择源节点和目标节点,这里选择源端1和目标端,即源端租户 test1 和目标端租户 test3。

1679474699

2.2、选择要迁移的源端数据库表,单击“>”,添加至目标端对象中,默认生成与源端相同的表名,也可以进行重命名。

1679474705

2.3、启动任务之后,可以看到任务的基本信息及迁移步骤详情。

1679474717

2.4、同理继续创建第二迁移项目(源端租户 test2 和目标端租户 test3),创建完成后,可在迁移项目列表中,查看添加的项目。

1679474726

3、验证迁移结果

3.1、全量迁移验证

登录目标端租户 test3 ,查看全量迁移的结果。可以看到 test1 租户的表 t1,和 test2 租户表 t2 已经迁移成功。 

[admin@126 ~]$obclient -hxxx.xxx.xxx.xxx -P2883 -uoms@test3#testoms -pXXX -A test_oms_3MySQL [test_oms_3]> show tables;
+----------------------+
| Tables_in_test_oms_3 |
+----------------------+
| t1                   |
| t2                   |
+----------------------+
2 rows in set (0.001 sec)MySQL [test_oms_3]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test10 |
| 11 | bb   | test11 |
+----+------+--------+
2 rows in set (0.001 sec)MySQL [test_oms_3]> select * from t2;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 20 | aa   | test20 |
| 21 | bb   | test21 |
+----+------+--------+
2 rows in set (0.001 sec)

3.2、增量同步验证

  • 分别在源端租户 test1 的表 t1 和租户 test2 的表 t2 中插入一条数据,在目标端租户 test3 中,查看数据同步的结果。可以看到新插入的数据已被同步过来。
MySQL [test_oms_1]> insert into t1(id,name,remark) values(12,'cc','test12');
MySQL [test_oms_2]> insert into t2(id,name,remark) values(22,'cc','test22');MySQL [test_oms_3]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test10 |
| 11 | bb   | test11 |
| 12 | cc   | test12 |
+----+------+--------+
3 rows in set (0.000 sec)MySQL [test_oms_3]> select * from t2;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 20 | aa   | test20 |
| 21 | bb   | test21 |
| 22 | cc   | test22 |
+----+------+--------+
3 rows in set (0.001 sec)MySQL [test_oms_3]>

  • 在源端租户 test1 的表 t1 中修改一条数据,在目标端租户 test3 中,查看数据同步的结果。可以看到修改的数据已被同步过来。

MySQL [test_oms_1]> update t1 set name = 'dd' where id = 12;MySQL [test_oms_3]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test10 |
| 11 | bb   | test11 |
| 12 | dd   | test12 |
+----+------+--------+
3 rows in set (0.000 sec)

  • 在源端租户 test2 的表 t2 中删除一条数据,在目标端租户 test3 中,查看数据同步的结果,可以看到 id =20的数据被删除。

MySQL [test_oms_2]> delete from t2 where id = 20;MySQL [test_oms_3]> select * from t2;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 21 | bb   | test21 |
| 22 | cc   | test22 |
+----+------+--------+
2 rows in set (0.000 sec)

3.3、反向增量验证

以租户 test3 反向增量迁移至租户 test1 为例,进行反向增量同步前,请确认正向增量同步已完成,

全量校验完成后,单击【进入下一阶段】,进行正向切换。

注意:启动正向切换前,请确保源端数据源为即将停写或者已经停写状态。

1679474742

1679474753

反向增量任务启动成功后,在目标端租户 test3 的表 t3 中插入一条数据,在源端租户 test1 中,查看数据反向同步的结果。可以看到新插入的数据已被反向同步过来。

MySQL [test_oms_3]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test10 |
| 11 | bb   | test11 |
| 12 | dd   | test12 |
+----+------+--------+
3 rows in set (0.003 sec)MySQL [test_oms_3]> insert into t1(id,name,remark) values(14,'ee','test14');MySQL [test_oms_1]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test10 |
| 11 | bb   | test11 |
| 12 | dd   | test12 |
| 14 | ee   | test14 |
+----+------+--------+
4 rows in set (0.000 sec)

在目标端租户 test3 的表 t1 中修改一条数据,在源端租户 test1 中,查看数据同步的结果。可以看到id = 10数据已被删除。

MySQL [test_oms_3]> delete from t1 where id = 10;MySQL [test_oms_1]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 11 | bb   | test11 |
| 12 | dd   | test12 |
| 14 | ee   | test14 |
+----+------+--------+
3 rows in set (0.000 sec)

测试二:

测试目的:测试能否正常将租户 test1 和租户 test2 中两张结构相同的表,迁移至租户 test3 的一张表中。

测试步骤:

  • 全量迁移:在 OMS 社区版中创建两个迁移项目,将源端租户 test1 和租户 test2 的全量数据迁移至目标端租户 test3 中。
  • 增量同步:在源端租户 test1 的表 t3 和租户 test2 的表 t3 中进行 insertdeleteupdate,查看目标端租户 test3 的表 t3 数据的变化。

测试结果:

同时将两个相同结构的表往另一张表汇总时,在进行全量迁移的过程中,若存在 id 相同的数据,后迁移的数据不会被同步过来,会导致后迁移的数据丢失。但是在增量同步的过程中,若插入的 id 相同,则后表插入的数据会覆盖前表插入的数据,导致前表插入的数据丢失。

租户数据库用户备注
test1test_oms_1omst3源端1
test2test_oms_2omst3源端2
test3test_oms_3omst3目标端

1、在客户端使用 oms 用户分别登录租户 test1 和 test2,创建表 t3。

obclient -hxxx.xxx.xxx.xxx -P2883 -uoms@test1#testoms -pXXX -A test_oms_1CREATE TABLE `t3` (
`id` int NOT NULL,
`name` varchar(45) DEFAULT NULL,
`remark` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) CHARSET=utf8mb4;MySQL [test_oms_1]> insert into t3(id,name,remark) values(010,'aa','r1');
MySQL [test_oms_1]> insert into t3(id,name,remark) values(011,'bb','r2');MySQL [test_oms_1]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | r1     |
| 11 | bb   | r2     |
+----+------+--------+
2 rows in set (0.002 sec)
obclient -hxxx.xxx.xxx.xxx -P2883 -uoms@test2#testoms -pXXX -A test_oms_2CREATE TABLE `t3` (
`id` int NOT NULL,
`name` varchar(45) DEFAULT NULL,
`remark` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) CHARSET=utf8mb4;MySQL [test_oms_1]> insert into t3(id,name,remark) values(010,'zz','r3');
MySQL [test_oms_1]> insert into t3(id,name,remark) values(012,'yy','r4');MySQL [test_oms_2]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | zz   | r3     |
| 12 | yy   | r4     |
+----+------+--------+
2 rows in set (0.002 sec)

2、创建租户 test1 至 租户test3 的数据迁移项目,具体操作请参见 数据迁移。

3、创建租户 test2 至 租户test3 的数据迁移项目。

3.1、选择源节点和目标节点,这里选择源端2和目标端,即源端租户 test2 和目标端租户 test3。

1679474776

3.2、选择要迁移的源端数据库表,单击“>”,添加至目标端对象中,默认生成与源端相同的表名,也可以进行重命名。

1679474788

3.3、配置迁移选项,这里注意在高级配置中,允许全量迁移目标表非空,因为前面已经创建了租户 test1 表1 至 test3 表 t3 的迁移项目,项目启动后,目标表非空。

1679474810

3.4、租户 test1 表1 至 test3 表 t3 的迁移项目,已经在租户 test3 中创建了表 t3,此时不需要再创建表,因此可直接跳过结构迁移,再单击右上角的“恢复”,继续进行下一步。

1679474818

创建完成后可在迁移项目列表中,查看到已创建的迁移项目。

1679474824

4、验证迁移结果

4.1、全量迁移验证

登录目标端租户 test3 ,查看全量迁移的结果。可以看到租户 test2 中 id = 10 因为和 租户 test1 中的 id 相同,导致数据未被迁移过来。在项目详情的全量校验中也可以看到数据不一致的提示。

1679474830

MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | r1     |
| 11 | bb   | r2     |
| 12 | yy   | r4     |
+----+------+--------+
3 rows in set (0.001 sec)

3.2、增量同步验证

  • 分别在源端租户 test1 的表 t3 和租户 test2 的表 t3 中插入一条数据,在目标端租户 test3 中,查看数据同步的结果。可以看到新插入的数据已被同步过来。
MySQL [test_oms_1]> insert into t3(id,name,remark) values(013,'cc','r5');
MySQL [test_oms_2]> insert into t3(id,name,remark) values(014,'xx','r6');MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | r1     |
| 11 | bb   | r2     |
| 12 | yy   | r4     |
| 13 | cc   | r5     |
| 14 | xx   | r6     |
+----+------+--------+
5 rows in set (0.001 sec)
  • 分别在源端租户 test1 的表 t1 和租户 test2 的表 t2 中插入一条 id 相同的数据,在目标端租户 test3 中,查看数据同步的结果。可以看到当 id 相同时后插入的数据会覆盖前插入的数据。
MySQL [test_oms_1]> insert into t3(id,name,remark) values(015,'dd','r7');
MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | r1     |
| 11 | bb   | r2     |
| 12 | yy   | r4     |
| 13 | cc   | r5     |
| 14 | xx   | r6     |
| 15 | dd   | r7     |
+----+------+--------+
6 rows in set (0.001 sec)MySQL [test_oms_2]> insert into t3(id,name,remark) values(015,'ww','r8');
MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | r1     |
| 11 | bb   | r2     |
| 12 | yy   | r4     |
| 13 | cc   | r5     |
| 14 | xx   | r6     |
| 15 | ww   | r8     |
+----+------+--------+
6 rows in set (0.000 sec)
  • 在源端租户 test1 的表 t3 中修改一条数据,在目标端租户 test3 中,查看数据同步的结果。可以看到修改的数据已被同步过来。
MySQL [test_oms_1]> update t3 set remark='test1' where id = 10;
MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test1  |
| 11 | bb   | r2     |
| 12 | yy   | r4     |
| 13 | cc   | r5     |
| 14 | xx   | r6     |
| 15 | ww   | r8     |
+----+------+--------+
6 rows in set (0.001 sec)
  • 在源端租户 test2 的表 t3 中删除一条数据,在目标端租户 test3 中,查看数据同步的结果,可以看到 id = 12 的数据已被删除。
MySQL [test_oms_2]> delete from t3 where id = 12;
MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test1  |
| 11 | bb   | r2     |
| 13 | cc   | r5     |
| 14 | xx   | r6     |
| 15 | ww   | r8     |
+----+------+--------+
5 rows in set (0.000 sec)

相关文章:

用OMS进行 OceanBase 租户间数据迁移的测评

基本概念 OceanBase迁移服务(,简称OMS),可以让用户在同构或异构 RDBMS 与OceanBase 数据库之间进行数据交互,支持数据的在线迁移,以及实时增量同步的复制功能。 OMS 提供了可视化的集中管控平台&#xff…...

【因果分析方法】MATLAB计算Liang-Kleeman信息流

【因果分析方法】MATLAB计算Liang-Kleeman信息流 1 Liang-Kleeman信息流2 MATLAB代码2.1 函数代码2.2 案例参考Liang-Kleeman 信息流(Liang-Kleeman Information Flow)是由 Liang 和 Kleeman 提出的基于信息论的因果分析方法。该方法用于量化变量之间的因果关系,通过计算信息…...

【Java基础知识系列】之Java类的初始化顺序

前言 类的初始化顺序 简单场景 代码示例 public class Person {private String name initName();private String initName() {System.out.println("【父类】初始化实例变量name");return "【父类】史蒂夫";}private int age;private static int staticVa…...

Swift 宏(Macro)入门趣谈(二)

概述 苹果在去年 WWDC 23 中就为 Swift 语言新增了“其利断金”的重要小伙伴 Swift 宏(Swift Macro)。为此,苹果特地用 2 段视频(入门和进阶)颇为隆重的介绍了它。 那么到底 Swift 宏是什么?有什么用&…...

vue elementui el-dropdown-item设置@click无效的解决方案

如图&#xff0c;直接在el-dropdown-item上面设置click&#xff0c;相应的method并没有被触发&#xff0c;查找资料发现需要在它的上级 el-dropdown 处使用 command 方法触发。 【template】 <el-dropdown placement"bottom-end" command"handleCommand&quo…...

如何用re从第1排第2个位置中找到两个数字返回(0,1)

以下是使用 Python 的re模块从第1班第2个位置这样的字符串中提取出数字并返回类似(0, 1)这种形式的示例代码&#xff0c;假设数字都是一位数的情况&#xff08;如果是多位数可以按照后续介绍稍作调整&#xff09;&#xff1a; import redef extract_numbers(text):numbers re.…...

vue中的keep-alive是什么,有哪些使用场景,使用了什么原理,缓存后如何更新数据

<keep-alive> 是 Vue.js 提供的一个内置组件&#xff0c;用于缓存动态组件&#xff0c;避免频繁的销毁和重建。这在某些场景下可以显著提升性能&#xff0c;特别是在组件频繁切换的情况下。以下是对 keep-alive 的详细讲解&#xff0c;包括它的定义、使用场景、原理分析、…...

LeetCode105.从前序与中序遍历构造二叉树

题目要求 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 提示: 1 < preorder.length < 3000inorder.length preorder.length-3000 < pr…...

LeetCode654.最大二叉树

LeetCode刷题记录 文章目录 &#x1f4dc;题目描述&#x1f4a1;解题思路⌨C代码 &#x1f4dc;题目描述 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子…...

C# 字段和属性

在 C# 中&#xff0c;字段和属性是定义类和结构体数据的两种方式。 字段用于直接存储数据&#xff0c;而属性提供了对字段的封装和访问控制。 1. 字段&#xff08;Fields&#xff09; 定义 字段是类或结构体中用于存储数据的变量。字段可以是任何数据类型&#xff0c;包括基…...

【leetcode】N皇后 回溯法c++

目录 51.N皇后 52.N皇后II 51.N皇后 51. N 皇后 - 力扣&#xff08;LeetCode&#xff09; 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间…...

Ubuntu 系统端口查询与管理详细分析

目录 前言1. 查询端口占用情况2. 释放占用的端口3. 修改应用程序的端口 前言 Window的端口被占用&#xff0c;类似的知识点&#xff1a;重装mysql时3306端口被占用解决方法 事情起因是宝塔的CPU负载过大&#xff0c;重启服务进程之后还是爆&#xff0c;后续发现是端口被占用&…...

Unity中使用StartCoroutine协程和Lerp方法,使GameObject缓慢移动

移动方法&#xff08;传入需要移动的instance和目标位置&#xff09; public Transform targetPosition; //目标位置 Vector3 target targetPosition.position;private IEnumerator MoveTowardsTarget(GameObject instance, Vector3 target){// 缓慢移动到目标的方法Vector3 …...

C++根据特定字符截取字符串

前言 在 C 中&#xff0c;如果根据特定字符进行字符串的截取&#xff0c;可以使用 std::string 类的成员函数 find() 来查找字符的位置&#xff0c;然后使用 substr() 来截取字符串。以下是一个示例&#xff0c;展示了如何根据指定字符截取字符串。 示例 #include <iostr…...

【How AI Works】读书笔记3 出发吧! AI纵览 第二部分

目录 1.说明 2.第二部分(P9~P10) 机器学习算法总结(监督学习) 3.单词 4.专业术语 1.说明 书全名:How AI Works From Sorcery to Science 作者 Ronald T.Kneusel 2.第二部分(P9~P10) 总结机器学习算法 作者把机器学习的过程比喻成输入-->黑盒-->输出 这里的标签可…...

No Module named pytorchvideo.losses问题解决

问题描述 最近在跑X3D的源码时发现&#xff0c;在conda powershell prompt中安装了pytorchvideo&#xff0c;但是仍然报错&#xff1a;No Module named pytorchvideo.losses 解决方案&#xff1a; 直接去https://gitcode.com/gh_mirrors/py/pytorchvideo/overview?utm_sour…...

Mac终端字体高亮、提示插件

一、安装配置“oh my zsh” 1.1 安装brew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 按照步骤安装即可&#xff0c;安装完成查看版本 brew -v 1.2 安装zsh brew install zsh 安装完成后查看版本 zsh --version 1.3 …...

Flowable 构建后端服务(后端以及数据库搭建) Flowable Modeler 设计器搭建(前端)

案例地址&#xff1a;xupengboo-flowable-example Flowable 构建后端服务&#xff08;后端以及数据库搭建&#xff09; 以 Spring Boot 项目为例&#xff1a; 引入 Flowable 必要依赖。 <!-- flowable 依赖 --> <dependency><groupId>org.flowable</gr…...

[Java]微服务拆分

导入项目 本篇及后续的微服务学习都是基于Centos7系统下的Docker部署&#xff0c;因此需要准备: Centos7的环境SSH客户端安装好Docker会使用Docker 之前的学习, 导致虚拟机中存在黑马商城项目以及mysql数据库, 为了保持一致, 需要删除 cd /rootdocker compose down 安装mysq…...

JavaScript逆向爬虫教程-------基础篇之JavaScript混淆原理

目录 一、常量的混淆原理1.1 对象属性的两种访问方式1.2 十六进制字符串1.3 Unicode字符串1.4 字符串的ASCII码混淆1.5 字符串常量加密1.6 数值常量加密二、增加 JS 逆向者的工作量2.1 数组混淆2.2 数组乱序2.3 花指令2.4 jsfuck三、代码执行流程的防护原理3.1 流程平坦化3.2 …...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...