hhdb数据库介绍(9-10)

计算节点特殊功能

EXPLAIN

在计算节点中,EXPLAIN语句用于显示SQL语句的路由计划。

mysql> explain  select t1.name,t2.name from test3 t1,test31 t2 where (t1.id>5 and t1.id<8) and (t2.id>5 and t2.id<18) group by t1.name,t2.name;
+----------+-------------------------------+-------------------------------------------------------------------------+
| datanode | type                          | sql                                                                     |
+----------+-------------------------------+-------------------------------------------------------------------------+
| 1        | PUSHDOWN_MULTINODE_QUERY::_$1 | SELECT `t1`.name FROM `TEST3` AS T1 WHERE `t1`.id < 8 AND `t1`.id > 5   |
| 2        | PUSHDOWN_MULTINODE_QUERY::_$1 | SELECT `t1`.name FROM `TEST3` AS T1 WHERE `t1`.id < 8 AND `t1`.id > 5   |
| 3        | PUSHDOWN_MULTINODE_QUERY::_$1 | SELECT `t1`.name FROM `TEST3` AS T1 WHERE `t1`.id < 8 AND `t1`.id > 5   |
| 4        | PUSHDOWN_MULTINODE_QUERY::_$1 | SELECT `t1`.name FROM `TEST3` AS T1 WHERE `t1`.id < 8 AND `t1`.id > 5   |
| 5        | PUSHDOWN_MULTINODE_QUERY::_$1 | SELECT `t1`.name FROM `TEST3` AS T1 WHERE `t1`.id < 8 AND `t1`.id > 5   |
| 6        | PUSHDOWN_MULTINODE_QUERY::_$1 | SELECT `t1`.name FROM `TEST3` AS T1 WHERE `t1`.id < 8 AND `t1`.id > 5   |
| 7        | PUSHDOWN_MULTINODE_QUERY::_$1 | SELECT `t1`.name FROM `TEST3` AS T1 WHERE `t1`.id < 8 AND `t1`.id > 5   |
| 8        | PUSHDOWN_MULTINODE_QUERY::_$1 | SELECT `t1`.name FROM `TEST3` AS T1 WHERE `t1`.id < 8 AND `t1`.id > 5   |
| 0        | JOIN_SUB:_$1                  |                                                                         |
| 1        | PUSHDOWN_MULTINODE_QUERY::_$1 | SELECT `t2`.name FROM `TEST31` AS T2 WHERE `t2`.id < 18 AND `t2`.id > 5 |
| 2        | PUSHDOWN_MULTINODE_QUERY::_$1 | SELECT `t2`.name FROM `TEST31` AS T2 WHERE `t2`.id < 18 AND `t2`.id > 5 |
| 3        | PUSHDOWN_MULTINODE_QUERY::_$1 | SELECT `t2`.name FROM `TEST31` AS T2 WHERE `t2`.id < 18 AND `t2`.id > 5 |
| 4        | PUSHDOWN_MULTINODE_QUERY::_$1 | SELECT `t2`.name FROM `TEST31` AS T2 WHERE `t2`.id < 18 AND `t2`.id > 5 |
| 5        | PUSHDOWN_MULTINODE_QUERY::_$1 | SELECT `t2`.name FROM `TEST31` AS T2 WHERE `t2`.id < 18 AND `t2`.id > 5 |
| 6        | PUSHDOWN_MULTINODE_QUERY::_$1 | SELECT `t2`.name FROM `TEST31` AS T2 WHERE `t2`.id < 18 AND `t2`.id > 5 |
| 7        | PUSHDOWN_MULTINODE_QUERY::_$1 | SELECT `t2`.name FROM `TEST31` AS T2 WHERE `t2`.id < 18 AND `t2`.id > 5 |
| 8        | PUSHDOWN_MULTINODE_QUERY::_$1 | SELECT `t2`.name FROM `TEST31` AS T2 WHERE `t2`.id < 18 AND `t2`.id > 5 |
| 0        | JOIN_SUB:_$2                  |                                                                         |
| 0        | JOIN_$1_$2                    |                                                                         |
| 0        | AGGREGATION_$1                |                                                                         |
+----------+-------------------------------+-------------------------------------------------------------------------+
20 rows in set (0.012 sec)

XPLAIN支持显示JOIN语句、UNION/UNION ALL、子查询语句的路由计划。其中:

  • DATANODE列为数据节点ID,0表示不会实际下发到存储节点;
  • TYPE列为SQL下发的执行动作类型;
  • SQL列则是在对应节点上会实际执行的SQL。

TYPE类型包括:

  • RESPONSE_DIRECT:直接返回的查询
  • FORWARD_PRIMARY: 转发到PRIMARY执行
  • CONSTANT_RANDOM_QUERY:下发到随机节点的常量查询
  • PUSHDOWN_ONENODE_QUERY:直接下发的单节点普通查询
  • PUSHDOWN_MULTINODE_QUERY:直接下发的多节点普通查询
  • PUSHDOWN_RANDOM_QUERY:下发到随机节点的普通查询
  • PUSHDOWN_AGGREGATION_QUERY:直接下发的聚合查询
  • COMMON_QUERY:普通查询
  • AGGREGATION:结果集需要简单的聚合处理,一次SQL就能返回结果
  • HAVING_FILTER:结果集过滤
  • BIG_OFFSET_LIMIT:超大offset的limit查询语句
  • SUBQUERY:子查询
  • GLOBAL_LOCK_SELECT:涉及全局表锁的查询
  • GLOBAL_RANDOM_IUD:涉及全局表随机函数的IUD语句
  • USER_VAR_FETCH:更新用户变量的值
  • UPDATE_DELETE_SUBQUERY:UPDATE/DELETE 子查询
  • ROUTE_BY_GLOBAL_INDEX:根据全局索引路由
  • LOAD_DATA:导入数据
  • INTO_OUT_FILE:导出数据
  • ONE_NODE_IUD:单节点IUD语句
  • MULTI_NODE_IUD:多节点IUD语句
  • INNER_TEMP_TABLE:内部临时表
  • UPDATE_SHARDING_KEY:更新分片字段的值
  • RELATIVE_IUD:父子表相关的IUD语句
  • INFORMATION_SCHEMA:information_schema相关查询
  • DAL_SHOW:show 命令聚合
  • IUD_TRIGGER:会触发操作的IUD语句
  • GLOBAL_IUD:全局表的IUD
  • 其他类型,还包括:SUM_DISTINCT、COUNT_DISTINCT、AVG_DISTINCT、GROUP_CONCAT、JOIN、JOIN_SUB、BNL_JOIN、BNL_JOIN_SUB、UNION、UPDATE_DELETE_JOIN、UPDATE_DELETE_LIMIT、DDL、ORACLE_SEQUENCE、FORWARD_CALCITE、HINT、CALL、EXCEPT、MINUS、INTERSECT、、ROWNUM、DROP_DATABASE

EXPLAIN的注意点:

  • 对于直接下发的SQL,EXPLAIN显示的SQL,和存储节点general_log中显示的会在格式上存在差异,EXPLAIN显示的是格式化的SQL;
  • EXPLAIN显示SQL需要执行多个DATANODE,在实际查询时,会根据上条子SQL的返回结果,进行二次路由,后执行的SQL最终可能只会在部分节点执行;
  • 部分SQL(即计算节点本身不支持)转发到第三方库解析的,EXPLAIN可能会显示不完全。

EXPLAINDN

在计算节点中,EXPLAINDN语句可直接下发到路由的数据节点上执行SQL语句执行计划,作用等同于MySQL中的EXPLAIN。

EXPLAINDN语法标准格式:

EXPLAINDN[=dnid_value] 要执行的SQL

注意
dnid_value的值为某个数据节点的ID号。用户可以替换dnid_value的值来指定具体的分片节点。

查询出的表字段结构信息如下:

字段名说明
idselect查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序
select_type查询的类型,主要用于区别普通查询、联合查询、子查询等的复杂查询
table显示这一行的数据是关于哪张表的
type显示查询使用了何种类型 system>const>eq_ref>ref>range>index>ALL
possible_keys可能用在这条语句上的索引
key显示计算节点实际决定使用的键。如果没有索引被选择,键是NULL
key_len显示计算节点决定使用的键长度。如果键是NULL,长度是NULL
ref显示哪个列或常数与key一起用于从表中选择行
rowsrows列显示计算节点相信它必须检验以执行查询的行数
ExtraOnly index,表示信息只用索引树中的信息检索出的
where used,表示一个WHERE子句将被用来限制哪些行与下一个表匹配
impossible where 表示用不到where

例如:

cara@127.0.0.1:cara 5.7.25 04:37:57> explaindn=1 select * from hotdb_tableinfo;
+----+-------------+-----------------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table           | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+-----------------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | hotdb_tableinfo | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   26 |   100.00 | NULL  |
+----+-------------+-----------------+------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set, 1 warning (0.14 sec)
cara@127.0.0.1:cara 5.7.25 05:06:38> explaindn=all select * from hotdb_logic_db;
+----+-------------+----------------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table          | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+----------------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | hotdb_logic_db | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL  |
|  1 | SIMPLE      | hotdb_logic_db | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL  |
|  1 | SIMPLE      | hotdb_logic_db | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL  |
|  1 | SIMPLE      | hotdb_logic_db | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL  |
+----+-------------+----------------+------------+------+---------------+------+---------+------+------+----------+-------+
4 rows in set, 1 warning (0.01 sec)

EXPLAINDN的注意点:

1.目前支持SELECT、INSERT、UPDATE、DELETE、REPLACE语句的执行计划;

在这里插入代码片root@127.0.0.1:hotdb 8.0.30 02:15:46> EXPLAINDN=1 SELECT * FROM HOTDB_T1 WHERE ID=100;
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table    | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | hotdb_t1 | NULL       | const | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | NULL  |
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)root@127.0.0.1:hotdb 8.0.30 02:43:08> EXPLAINDN=ALL INSERT INTO HOTDB_T1 VALUES(1002,876,'501','979');
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | INSERT      | hotdb_t1 | NULL       | ALL  | NULL          | NULL | NULL    | NULL | NULL |     NULL | NULL  |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)EXPLAINDN=1 UPDATE HOTDB_T1 set k='876' where id=100;
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
| id | select_type | table    | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra       |
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
|  1 | UPDATE      | HOTDB_T1 | NULL       | range | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | Using where |
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
1 row in set, 1 warning (0.01 sec)root@127.0.0.1:hotdb 8.0.30 02:52:01> EXPLAINDN=2 DELETE FROM HOTDB_T1 WHERE ID=200;
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
| id | select_type | table    | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra       |
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
|  1 | DELETE      | HOTDB_T1 | NULL       | range | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | Using where |
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
1 row in set, 1 warning (0.01 sec)root@127.0.0.1:hotdb 8.0.30 05:08:04> explaindn replace into HOTDB_T2 select * from HOTDB_T1 limit 1;
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | REPLACE     | HOTDB_T2 | NULL       | ALL  | NULL          | NULL | NULL    | NULL | NULL |     NULL | NULL  |
|  1 | SIMPLE      | HOTDB_T1 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |  326 |   100.00 | NULL  |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
2 rows in set, 1 warning (0.00 sec)

2.支持跨逻辑库的执行计划;

root@127.0.0.1:hotdb 8.0.30 05:07:59> EXPLAINDN INSERT INTO HOTDBTEST2.HOTDB_T3 SELECT * FROM HOTDBTEST.HOTDB_T1 LIMIT 1;
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | INSERT      | HOTDB_T3 | NULL       | ALL  | NULL          | NULL | NULL    | NULL | NULL |     NULL | NULL  |
|  1 | SIMPLE      | HOTDB_T1 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |  326 |   100.00 | NULL  |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
2 rows in set, 1 warning (0.01 sec)

3.暂不支持跨分片复杂查询;
4.当指定查询的数据节点与实际路由节点不一致时,会有相应的错误提示;

cara@127.0.0.1:cara 5.7.25 05:04:47> select * from hotdb_logic_db where logic_dbid=45;
+------------+--------------+---------------------------+-----------------+--------------------+------+
| logic_dbid | logic_dbname | default_nodes             | default_charset | default_collate    | DNID |
+------------+--------------+---------------------------+-----------------+--------------------+------+
|         45 | EZOFFICE     | 1,2,3,5,94,95,96,97,98,99 | utf8mb4         | utf8mb4_general_ci |   44 |
+------------+--------------+---------------------------+-----------------+--------------------+------+
1 row in set (0.00 sec)cara@127.0.0.1:cara 5.7.25 05:06:32> explaindn=1 select * from hotdb_logic_db where logic_dbid=45;
ERROR 10010 (HY000): unsupported explaindn statement

OnlineDDL

计算节点管理端(3325)支持OnlineDDL功能,保证了在进行表变更时,不会阻塞线上业务读写,库依然能正常对外提供访问,具体使用方法如下:

登录3325端管理端口,使用onlineddl "[DDLSTATEMENT]"语法可以执行onlineddl语句,例如:onlineddl “alter table customer add column testddl varchar(20) default ‘测试onlineddl’”;
执行show @@onlineddl语句,即可显示当前正在运行的OnlineDDL语句及语句执行速度,progress显示当前DDL执行进度(单位:%),speed显示为当前DDL运行速度(单位:行/ms),例如:

mysql> show @@onlineddl;
+--------------+-------------------------------------------------------------------------------+----------+---------+
| schema       | onlineddl                                                                     | progress | speed   |
+--------------+-------------------------------------------------------------------------------+----------+---------+
| TEST_DML_JWY | ALTER TABLE CUSTOMER ADD COLUMN TESTDDL VARCHAR(20) DEFAULT '测试ONLINEDDL'   |   0.2300 | 23.3561 |
+--------------+-------------------------------------------------------------------------------+----------+---------+

注意
onlineddl 语句不是执行下去就代表DDL完成, 返回了"Query OK, 0 rows affected
"仅代表DDL语句可以执行, 如果想看是否执行完成,要查看show @@onlineddl中progress 显示的进度。show
@@onlineddl结果为空时,代表所有DDL执行完毕且当前无其他DDL任务,如果中途因为网络或其他异常DDL中断,会回滚整个DDL。

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

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

相关文章

Linux磁盘分区

文章目录 磁盘分区 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Linux专栏&#xff1a;点击 ⏰️创作时间&#xff1a;2024年11月12日13点20分 磁盘分区 MBR 主启动记录分区方案指定了运行BIOS固件的系统上应如何对磁盘进行分区&#xff0c;存在与驱动开…

2. Spring Cloud 微服务基础环境搭建

2. Spring Cloud 微服务基础环境搭建 文章目录 2. Spring Cloud 微服务基础环境搭建前言1. 微服务需求解析2. 具体搭建微服务步骤&#xff1a;2.1 创建父工程 &#xff0c;用于聚合其它微服务模块2.1.1 需求说明/图解2.1.2 具体实现步骤2.1.3 注意事项和具体细节 2.2 创建会员中…

微信朋友圈营销

朋友圈营销4567法则

【赵渝强老师】MySQL InnoDB的表空间

InnoDB存储引擎目前是MySQL默认的存储引擎&#xff0c;它主要由三部分组成&#xff0c;分别是&#xff1a;存储结构、内存结构和线程结构。InnoDB的存储结构又可以分为逻辑存储结构和物理存储结构。InnoDB存储引擎的逻辑存储结构和Oracle大致相同&#xff0c;所有数据都被逻辑地…

docker安装redis

1、拉取镜像 docker pull redis:latest运行之前需要再/data/redis创建redis.conf配置文件 内容如下 # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 ::1 #bind 127.0.0.1protected-mode noport 6379tcp-backlog 511requirepass roottimeout 0tcp-keepalive 300daemonize no…

vue项目多入口文件。vue.config.js如何修改配置

我们知道vue项目是单入口。指定一个入口文件去加载他所有的依赖。如果我们希望他有多个入口文件怎么办呢&#xff1f; 我们可以在public下面新建一个html的文件 然后src下新增一个文件夹&#xff0c;用来放APP.vue和 main.js。 然后修改vue.config.js。把他的pages改成2个入…

NCC前端调用查询弹框

系统自带的查询模板 弹框 调启使用默认的 查询模板 是在 单据模板的 列表模板中&#xff0c;有个查询区域 &#xff0c;查询区域就是查询模板内容如果在列表页做客开 新增按钮 调启查询模板 无问题&#xff0c;但是目前需求是需要再卡片页面下调启系统标准的调启模板代码 //调…

SpringBoot中的注解详解(二)

四、Param() &#xff08;mapper包 Dao层&#xff09; Param()&#xff1a; 功能&#xff1a; 用于在Mapper接口的方法参数上标记参数名称&#xff0c;以便在SQL语句中引用这些参数。 参数命名&#xff1a;在Mapper接口的方法参数上使用Param注解&#xff0c;可以为参数指定一…

一文1800字使用Jmeter进行http接口性能测试!

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 为什么要做接口测试&#xff1f; 越底层发现b…

新版flask pin码计算

Python debug pin码计算 需开启debug from flask import Flask app Flask(__name__) app.route("/") def index():return "Hello World" app.run(debugTrue) /console路由填入上方控制台的 PIN 码即可执行 Python 命令 Flask 的 PIN 码计算仅与 werkze…

比 PyTorch 更快的嵌入Python库:FastEmbed

嵌入生成 已成为自然语言处理&#xff08;NLP&#xff09;中不可或缺的一部分。 无论是智能推荐、文本相似度计算&#xff0c;还是聊天机器人&#xff0c;嵌入技术都扮演着重要角色。然而&#xff0c;我们常常会陷入繁重的库和庞大的模型中&#xff0c;耗时费力。 今天&#…

大模型部署解决方案之TorchServe+vLLM

TorchServe 是PyTorch 中将模型部署到生产环境的一个解决方案。它用HTTP 或HTTPS API 封装模型&#xff0c;可以处理多种任务&#xff0c;包括为部署模型分配workers、负责客户端和服务器之间通信等。 10月份发布的TorchServe 0.12 增加了对GenAI的支持&#xff0c;简化了大语…

博弈论(零和博弈)英文版题解

翻译&#xff1a; 假设我们有一个两人零和游戏&#xff0c;每个玩家有两种行动&#xff0c;行收益矩阵如下&#xff1a; 计算行和列玩家的最小最大最优策略以及游戏的价值。 X Y A a11 a12 B a21 a22 选项&#xff1a; 1. 行玩家&#x…

虚拟现实辅助工程技术应用于员工培训

你还在使用传统的入职方法吗&#xff0c;比如印刷指南、演示、课堂培训、讲座等等&#xff1f;是时候改变了。虚拟现实辅助工程技术提供了一个机会&#xff0c;可以让新员工的入职过程更高效、更有趣&#xff0c;也更令人兴奋。想象一下这样一个场景&#xff0c;新员工可以在第…

【健康警钟】胆已切除,生活调理有“胆”更精彩!必看指南!

在现代社会&#xff0c;由于生活习惯、饮食习惯等多种因素&#xff0c;一些人可能不得不面对胆囊切除手术。虽然手术能够有效解决胆囊结石、胆囊炎等问题&#xff0c;但胆囊作为人体的一部分&#xff0c;其功能的丧失无疑会对生活带来一定影响。那么&#xff0c;胆被割了之后&a…

windows NGIMX配置WebSocket反向代理

linux下 据说nginx是要有 stream的模块 Linux安装Nginx步骤之后续&#xff0c;带stream模块-CSDN博客 Nginx从1.3.13版本就开始支持WebSocket linux 下参考如下链接 配置 Nginx 反向代理 WebSocket - 哈喽哈喽111111 - 博客园 (cnblogs.com) SSL的配置参考 【Linux】采用…

三种读取配置文件的方式

在编写JDBC的util包以读取文件时&#xff0c;配置文件的位置会影响其读取方式。当前&#xff0c;默认配置文件直接放置在src文件夹下。 当读取.properties文件代码写法为&#xff1a; Properties props new Properties(); props.load(new FileInputStream("db.propertie…

丹摩征文活动|CogVideoX-2b:从安装到上线,轻松搞定全过程!

CogVideoX-2b&#xff1a;从安装到上线&#xff0c;轻松搞定全过程&#xff01; CogVideoX简介 CogVideoX的推出标志着视频生成技术的一次重大突破。过去&#xff0c;如何在保持高效的同时提升视频质量一直是一个难题&#xff0c;但CogVideoX 通过其先进的3D变分自编码器&…

工位管理优化:Spring Boot企业级系统

3系统分析 3.1可行性分析 通过对本企业级工位管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本企业级工位管理系统采用SSM框架&#xff0c;JAVA作为开…

EMQX服务器的搭建,实现本地机和虚拟机之间的MQTT通信(详细教程)

前言 MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的&#xff0c;这些特点使它适用范围非常广泛。 MQTT协议中有三种身份&#xff1a;发布者&#xff08;Publish&#xff09;、代理&#xff08;Broker&#xff09;&#xff08;…