多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

LabVIEW连接MySQL完全指南:从环境搭建到数据管理实战

LabVIEW连接MySQL完全指南:从环境搭建到数据管理实战 1. 数据管理需求的本质为什么 LabVIEW 项目要接 MySQL1.1 当 TDMS/CSV 文件堆满硬盘之后很多做 LabVIEW 的工程师一开始处理测量数据都是往 CSV 或 TDMS 里写。单台设备、单个测试项目的时候这种方式确实简单打开文件就能看到波形Excel 也能直接读。但随着项目交付到产线、设备数量变多问题很快就藏不住了。举一个我实际遇到的例子一条装配线有六台测试工位每台工位每天生产 2000 件产品每件产品记录 30 个测试参数。一天下来就是 36 万条记录分散在六台电脑的若干 CSV 文件里。过了两周质量工程师想查某一型号产品的合格率趋势只能让产线工人把文件一个个拷出来再写脚本合并。这个过程既慢又容易出错更别提多台工位同时写入同一个文件时的文件锁冲突。这就是数据管理需求出现的真实起点。数据库的核心价值不是“存数据”而是让数据可以被结构化检索、被并发访问、被长期追溯。MySQL 恰好是这套体系里最成熟、最轻量的选择之一。它免费、稳定、资料多而且不需要像大型商业数据库那样养一个专职 DBA。对 LabVIEW 开发者来说把 MySQL 接进来相当于给测量系统装了一个能回答问题的“大脑”。1.2 拆层设计采集、显示、入库必须各干各的说一个很多 LabVIEW 新手踩过的坑把数据库写入直接塞进采集循环或者让 UI 事件里同步执行 SQL。结果界面卡死、数据丢失、程序跑一阵子就崩。正确的架构思路是分层。采集层负责从仪器、PLC、板卡拿数据拿到之后立刻丢进队列不等待任何数据库操作UI 层只负责展示最近状态和历史曲线独立的数据入库循环从队列里取数据攒够一批后批量写 MySQL。这样做有三个好处采集实时性不受数据库波动影响、写入吞吐量可以成倍提升、代码逻辑清晰容易定位问题。队列设计也要注意。队列深度不要设成无限大否则数据库长时间不可用时队列会吃光内存。我的习惯是设置一个固定上限比如 5000 条队列满时丢弃最旧的数据并记录一条告警日志。对实时监控场景来说宁可丢旧数据也不能让采集循环阻塞。1.3 什么样的项目适合这套组合LabVIEW 加 MySQL 的组合覆盖的场景比很多人想象中要广。最常见的包括测试数据管理产线上每件产品的测试参数、判定结果、测试时间入库方便做质量追溯。设备状态监控连续采集设备振动、温度、电流等信号定期轮询写入数据库后续做趋势分析。实验室数据平台多台试验台数据汇总到统一数据库不同项目组按权限查询。智能工厂数据方案PLC、仪器、传感器数据统一入湖对接上层 MES 或者可视化看板系统。如果你的项目只是单机运行、数据量小、没有多人查询需求直接用文件存储也无可厚非。但一旦涉及到“多工位写入”“跨时间查询历史”“对接管理系统”这些词就应该认真考虑数据库方案。MySQL 的入门门槛不高但要跑得稳还是需要把环境搭建、表设计、连接方式、异常处理这些基本功打扎实。2. 打通链路三种 LabVIEW 连接 MySQL 的方案与选型2.1 NI Database Connectivity Toolkit官方但需要授权NI 官方提供的数据库连接工具箱Database Connectivity Toolkit是很多工程师首先想到的方案。它在 LabVIEW 函数选板里提供了一组 VI比如 DB Tools Open Connection、DB Tools Execute Query、DB Tools Fetch Recordset Data封装度比较高不需要自己跟 ActiveX 底层打交道。使用流程大致是先用 DB Tools Open Connection 建立连接传入连接字符串然后根据要执行的操作选择 DB Tools Execute QuerySELECT 用或者 DB Tools Execute Non-QueryINSERT/UPDATE/DELETE 用查询结果用 DB Tools Fetch Recordset Data 读取最后在错误簇汇合处关闭连接。这个方案的优点是官方维护、兼容性有保障和 LabVIEW 版本配套测试过。缺点是 Toolkit 通常需要额外授权价格不便宜在国内很多中小团队里大家更愿意找免费方案来替代。如果你的公司已经买了正版授权或者项目预算充足这个方案无疑是最省心的一条路。2.2 LabSQL社区通行证免费但要忍兼容性LabSQL 是 LabVIEW 社区流传最广的免费数据库组件本质是用 ActiveX 封装 ADODB 对象你把整个 LabSQL 文件夹放到user.lib目录下重启 LabVIEW 后就可以在用户库函数选板里看到它的 VI 集合。核心 VI 包括 ADO Connection Create、ADO Connection Open、ADO Recordset Open、SQL Execute 等。LabSQL 的好处是透明、免费、可自由修改底层代码。遇到问题可以把 VI 打开一层层往下查看它是怎么调用 ADODB 的。但它有几个老毛病首先是停更多年对 64 位 LabVIEW 支持不佳其次是依赖 ADODB 组件在某些精简版 Windows 或权限受限环境下会出现“无法创建 ActiveX 对象”的错误。我在多个项目里用 LabSQL 跑过几年总结下来的经验是32 位 LabVIEW 环境下配合 32 位 MySQL ODBC 驱动稳定性是够用的64 位环境要么升级到官方 Toolkit要么改走中间件方案死磕 LabSQL 性价比不高。2.3 中间件/REST 网关面向多工位和未来的架构第三种方案是这几年越来越流行的LabVIEW 不直接连 MySQL而是通过 HTTP 接口访问一个轻量级数据网关。网关可以用 Python、Node.js 或 Go 编写数据库账号、连接池、写入策略都收敛在网关这一层LabVIEW 端只负责把数据打包成 JSON POST 过去。这个方案最大的优势是解耦。LabVIEW 不依赖具体数据库驱动换 MySQL 版本、换连接串、甚至换时序数据库都不需要改动采集端代码。多个 LabVIEW 工位可以共用同一个网关数据权限也好控制。智能工厂里常见的“设备端屏蔽数据库账号”需求用网关方案很自然就实现了。缺点是链路多了一跳排查问题时要同时看 LabVIEW 日志和网关日志。另外网关本身也是要维护的。如果团队里有后端开发能力这个方案非常值得采用如果是纯 LabVIEW 团队、只想快速把数据落库前面两个方案反而更直接。2.4 怎么选给一个实用的判断框架我一般这样建议单机实验项目、追求最低成本选 LabSQL公司买了正版、希望少踩坑选官方 Toolkit多工位并发写、有后端开发支持、后续要对接 Web 大屏选中间件网关。三者并不冲突同一个项目里甚至可以先跑通 LabSQL再逐步把写入部分挪到网关后面。3. 环境准备从 MySQL 安装到 ODBC 驱动的完整落地3.1 Windows 10 下 MySQL 8.0 压缩包安装实录搜索“mysql在windows10上怎么安装”的朋友看到的教程大多是 exe 安装包。但工程机上我强烈推荐免安装 ZIP 包方式因为不往系统里塞多余的服务组件卸载干净配置也完全可控。下面以 mysql-8.0.46-winx64 为例给出完整过程。先去官网下载 ZIP 包解压到无空格、无中文的目录例如d:\tool\mysql-8.0.46-winx64。在这个目录下新建my.ini内容如下[mysqld] basedirD:/tool/mysql-8.0.46-winx64 datadirD:/tool/mysql-8.0.46-winx64/data port3306 character-set-serverutf8mb4 default-storage-engineInnoDB max_connections200 [client] default-character-setutf8mb4然后用管理员身份打开命令提示符依次执行cd /d D:\tool\mysql-8.0.46-winx64 mysqld --initialize-insecure mysqld --install MySQL80 net start mysql--initialize-insecure初始化完成后root 用户默认没有密码这是开发测试环境最方便的做法。登录后立刻修改密码ALTER USER rootlocalhost IDENTIFIED BY YourStrongPassword; FLUSH PRIVILEGES;有几个高频坑要提前说。net start mysql如果提示“服务名无效”说明mysqld --install没成功常见原因是以管理员身份运行这一步提示“发生系统错误 1067”大概率是my.ini中的路径写错或 datadir 目录初始化失败去data目录下的.err日志文件里查具体原因最快。端口被占用时用netstat -ano | findstr 3306查出占用进程。如果你更倾向老版本MySQL 5.7.44 的安装逻辑也差不多只是默认字符集和认证插件有差别。8.x 使用 caching_sha2_password5.7 使用 mysql_native_password这个差异会在后面 ODBC 连接时暴露出来需要留意。3.2 Docker 安装 MySQL留一条备用路也有不少同事在开发机上用 Docker 跑 MySQLdocker run -d --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD123456 \ -e TZAsia/Shanghai \ mysql:8.0好处是拉起来就能用、切换版本干净利落。坏处是 Windows 上 Docker Desktop 资源占用高、容器数据卷映射有时出问题而且“docker安装mysql失败”的案例五花八门端口被宿主机占用、Docker 引擎没启动、磁盘空间不足、镜像拉取超时。我的建议很直接开发测试机用 Docker 无所谓生产环境长期跑数据采集还是用原生安装更稳定。因为 LabVIEW 程序往往跑在工控机上工控机内存和 CPU 本来就紧张再让 Docker 在后台吃资源不划算。3.3 ODBC 驱动32 位和 64 位必须对上号LabVIEW 连接 MySQL 时绝大多数情况是通过 ODBC 驱动完成的。位数匹配是这里最关键的一点32 位 LabVIEW 必须用 32 位 ODBC 驱动64 位 LabVIEW 必须用 64 位驱动。很多“连接失败、找不到驱动”的诡异问题根源都是位数不匹配。下载 MySQL Connector/ODBC 8.x 安装包时安装界面可以选择安装 32 位还是 64 位或者两者都装。建议两台驱动的都装上省得到时候工控机上的 LabVIEW 版本变了还要重装一遍。装完驱动后在 Windows 的“ODBC 数据源管理器”里新建一个系统 DSN填写服务器地址、端口、用户名、密码、数据库名字符集选 utf8mb4。这一步搞定之后先用 DSN 方式在 LabVIEW 里测试连接能通再考虑无 DSN 连接字符串。无 DSN 的连接串长这样Driver{MySQL ODBC 8.0 Unicode Driver};Server127.0.0.1;Port3306;Databasetestdb;Userlabview;Passwordxxx;Option3;用无 DSN 方式在部署时少一次配置但字符串里要确保 IP、库名、账号密码都没写错否则报错信息会比较隐晦。3.4 账号权限别把 root 给 LabVIEW 用这是个容易被忽略但很重要的安全习惯。给 LabVIEW 程序创建专门账号不要直接使用 rootCREATE USER labview% IDENTIFIED BY Labview123; GRANT SELECT, INSERT, UPDATE, DELETE ON testdb.* TO labview%; FLUSH PRIVILEGES;这样即使 LabVIEW 端连接串泄露数据库的安全影响也被限制在 testdb 库内。产线上如果有多台工位还可以按工位创建不同账号数据权限好追溯。4. 数据库设计与增删改查实操全流程4.1 两类表设计设备信息表和测试记录表在落库之前先想清楚关系模型。对于产线测试系统我推荐一个比较通用的主从结构。设备信息表存设备的静态属性测试记录表存每次测试的动态结果。CREATE DATABASE testdb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE TABLE device_info ( id INT AUTO_INCREMENT PRIMARY KEY, device_code VARCHAR(32) NOT NULL UNIQUE, device_name VARCHAR(64), station_no VARCHAR(16), remark VARCHAR(255) ) ENGINEInnoDB; CREATE TABLE test_record ( id BIGINT AUTO_INCREMENT PRIMARY KEY, device_code VARCHAR(32) NOT NULL, test_time DATETIME NOT NULL, temperature REAL, pressure REAL, result TINYINT, task_id VARCHAR(64), KEY idx_device_time (device_code, test_time) ) ENGINEInnoDB;为什么device_code和test_time要建联合索引因为九成查询都带“哪台设备 哪个时间段”这两个条件。没有这个索引数据量到几十万行时每次查询都可能全表扫描界面卡顿会非常明显。4.2 写入流程参数化 INSERT 不做字符串拼接LabVIEW 写入 MySQL 的流程以 LabSQL 为例连接 → 准备 SQL 语句 → 绑定参数 → 执行 → 关闭。强烈推荐使用带占位符的参数化写法INSERT INTO test_record(device_code, test_time, temperature, pressure, result) VALUES (?, ?, ?, ?, ?)在 LabVIEW 中通过 ADO Parameter Create 创建参数再逐个绑定值。参数化不只是为了防 SQL 注入更实际的好处有两个一是字符串类型会自动转义避免数据里的特殊字符破坏 SQL二是特殊类型不会被错误地转成字符串减少 DATE 和数值字段的格式兼容问题。在执行大批量插入时不要在循环里一条一条提交而是攒一批再执行。以测试系统为例如果每 500 条作为一批配合事务提交写入速度能提升好几个量级。早期的程序用单条插入一秒只能写几十条改成批量后一秒写几百上千条很正常。4.3 查询流程从 Recordset 到数组再到波形查询和写入的差异在于结果集。执行 SELECT 之后拿到的是一个 RecordsetLabVIEW 里需要循环读取每一行再取字段值。流程大致是打开连接 → 执行 SQL → 循环读取 Recordset → 提取字段组合成簇或数组 → 释放 Recordset → 关闭连接。这里要提醒一点Recordset 读取完毕前连接不能关。如果循环没读完就执行 Close程序会报错或者只能拿到前几行。正确做法是把循环放在读取 VI 和自己定义的停止条件之间读完所有行后让错误簇自然流到关闭 VI。查询条件里如果有时间范围建议用 BETWEEN 或者 、 写法并且把日期时间作为参数传入。如果直接在 LabVIEW 端把时间控件转成字符串再拼 SQL会因为时间格式不同查不到数据。LabVIEW 的时间和 MySQL 的 DATETIME 还有个精度差异LabVIEW 时间精度远高过秒级MySQL DATETIME 默认精确到秒。需要毫秒精度时字段类型要用 DATETIME(3)。4.4 更新、删除与存储过程的使用边界更新和删除操作编写相对简单但风险很高。核心原则是必须带 WHERE 条件执行前先确认影响行数。我在现场见过一次误操作界面上点“清空该批次数据”因为 WHERE 条件少了一个设备编号整张测试表被清空。后来我要求所有删除操作之前先在 SQL 客户端执行一条 SELECT COUNT(*) 做预估确认条数后才允许执行 DELETE。对于高频且逻辑固定的操作可以考虑封装存储过程。例如上报一组测量数据的存储过程DELIMITER $$ CREATE PROCEDURE sp_insert_record( IN p_device_code VARCHAR(32), IN p_test_time DATETIME, IN p_temp REAL, IN p_pressure REAL, IN p_result TINYINT ) BEGIN INSERT INTO test_record(device_code, test_time, temperature, pressure, result) VALUES (p_device_code, p_test_time, p_temp, p_pressure, p_result); END$$ DELIMITER ;LabVIEW 端只需要执行CALL sp_insert_record(?, ?, ?, ?, ?)一次网络往返就能完成操作。多工位并发上报时这种方式能明显降低数据库连接的压力。缺点是存储过程的调试和维护在 LabVIEW 端不够直观建议只在事务逻辑确实稳定后再前移。4.5 事务、锁与死锁的现场认知数据一致性要求高时必须使用事务。批量插入的典型写法是START TRANSACTION; INSERT INTO test_record(...) VALUES (...); INSERT INTO test_record(...) VALUES (...); COMMIT;事务能保证一批数据要么全部写入、要么全部回滚。代价是事务执行期间会持有锁。MySQL InnoDB 默认在可重复读隔离级别下使用行锁两个事务如果分别持有了对方需要的锁就可能触发死锁检测系统会自动回滚其中一个事务。应对死锁我的经验有四条每个事务尽快提交不要在事务里做大量计算或等待用户确认多个表被同时操作时程序都按同样的顺序访问减少交叉锁WHERE 条件的字段尽量有索引让锁粒度落到行而不是表应用程序捕获死锁错误码做一次重试。死锁通常瞬时发生重试大概率成功。很多“数据库死锁”问题本质上是因为 LabVIEW 程序把事务跨度过长了。比如在采集循环里开启事务采集 30 秒后才提交这期间其他工位的程序都在等锁死锁概率会飙升。事务应该只包住“写库”这一步不要包住“采集计算”。5. 常见问题与排查技巧实录5.1 安装启动阶段的高频故障速查下表是我这几年被问得最多的启动和连接问题直接按现场经验整理现象可能原因处理办法net start mysql 提示 1067my.ini 路径/datadir 错误、端口占用检查data\*.err日志修正配置后重试Navicat/Workbench 报 2003MySQL 服务未启动或防火墙拦截确认服务启动放行 3306 端口登录报 1045 Access denied密码错误或账号权限不足使用正确密码检查账号授权中文写入后乱码库、表、连接字符集不是 utf8mb4修改 my.ini 默认字符集重建表安装阶段的“1067 错误”是搜索量很高的关键词。大多数时候不是 MySQL 本身有问题而是 my.ini 中路径写错或者 datadir 没有初始化成功。把data目录下的.err日志打开看一眼错误原因写得很直白。5.2 LabVIEW 连接侧常见报错“无法创建 ActiveX 对象”是 LabSQL 方案中最常见的报错。排查顺序是确认 LabVIEW 是否以管理员权限运行确认 LabVIEW 是 32 位还是 64 位确认 ADODB 组件是否在系统里正常注册。如果 LabVIEW 是 64 位LabSQL 出问题的概率会高不少。最省心的方式是新建一个 32 位项目副本配合 32 位 MySQL ODBC 驱动运行。现场工控机通常不缺 32 位运行环境这个方案能规避一多半兼容问题。还有个很隐蔽的问题是 DSN 位数不匹配。ODBC 数据源管理器在 Windows 里分 32 位和 64 位两个版本你在 32 位管理器里建了 DSN64 位进程去连接时就会报“找不到数据源”反之也一样。建议在连接字符串里优先使用无 DSN 方式直接从根上消除这个歧义。5.3 性能、连接泄漏与稳定性问题数据量上来之后最先暴露的是写入性能。排查顺序很固定先看是否一条一条提交再看索引是否过多索引会拖慢插入最后看网络延迟。绝大多数项目的瓶颈就是提交频率太高改成批量提交就能解决。更隐蔽的问题是连接泄漏。LabVIEW 程序如果每次执行完 SQL 后没有正确关闭连接MySQL 端的连接数会慢慢涨满最终所有新连接都失败。这个问题靠代码审查看不出来需要监控show processlist;观察连接数变化。根治方法是在连接管理状态机里做到“打开后必有关闭”无论执行成功还是失败错误簇都要流到 Close VI。还有磁盘被 binlog 日志占满的情况。调试机器如果不做备份可以考虑关闭 binlog生产环境则必须规划日志清理策略。binlog 不是越大越好它只是崩溃恢复和数据同步的中间产物。5.4 排查心法先证明 SQL 没问题再碰 LabVIEW我在现场处理“查不到数据”这类问题顺序永远是先在 MySQL 客户端里手工执行一遍 SQL确认 SQL 逻辑无误后再回到 LabVIEW 检查参数绑定、连接串和数据类型。很多同事一上来就在 LabVIEW 里加探针绕一两个小时最后发现是 SQL 语句引号少了一个或者表名字段名大小写对不上。Windows 下的 MySQL 表名大小写默认不敏感但字段名大小写在某些场景下还是有讲究这些用探针根本测不出来。如果遇到“数据查不到”还要先分辨是“没写进去”还是“写进去但查不出来”。前者去看 MySQL 的写入日志和事务是否提交后者重点检查查询条件的时间格式和字段类型。跟时间相关的问题最多LabVIEW 的 DateTime 和 MySQL DATETIME 转换时建议在数据入库前统一格式化为YYYY-MM-DD HH:MM:SS避免两边格式漂移。6. 从能用迈向好用进阶功能与落地经验6.1 自动重连状态机现场设备运行环境往往不稳定数据库服务可能重启、网线可能松掉、交换机可能闪断。如果在 LabVIEW 程序里不做自动重连数据库一断采集到的数据就开始积压恢复后还得手动重启程序。我习惯用状态机管理数据库连接空闲状态、执行状态、错误状态、重连状态。每次执行 SQL 前检查连接是否有效失败时进入重连状态连续重试 5 次仍失败就弹窗通知操作员“数据库不可用”避免无限重试造成假死。程序空闲时每 30 秒执行一次SELECT 1保活防止连接被 MySQL 服务端超时回收。这样的状态机代码看起来多但恰恰是整个数据管理系统的“安全带”。没有它前面做的所有工作都可能在一次网络抖动后失去意义。6.2 时序分表与历史数据归档测试数据本质上是时序数据。单表数据量到几百万行后即使有索引查询性能和写入性能都会明显下降。一个常见的优化策略是按时分表比如按月建test_record_202506、test_record_202507这样。应用层根据查询条件拼不同的表名历史数据清理直接 DROP 表比 DELETE 快几个数量级。MySQL 8.0 还支持分区表但分区对运维要求更高查询如果没命中分区键性能不一定比全局索引好。中小测试团队用月表足够。数据归档建议分两层在线库保留最近 3 到 6 个月的热数据旧数据定期迁到历史库或者冷存储。这样在线查询的速度能保持稳定也符合很多制造业客户对数据保存期限的要求。6.3 用 Snap7 把 PLC 数据直接灌进 MySQL聊完数据库本身回到数据源头。在智能工厂数据管理方案里LabVIEW 经常要直接和 PLC 通信。S7 系列 PLC 是产线上最常见的控制器而 LabVIEW 原生不直接支持 S7 协议很多项目会引入开源的 Snap7 库。搜索里“labview s7 协议直连snap7 库”热度一直不低说明这个组合的实战需求相当大。用 Snap7 的思路很清晰连接 PLC 的 IP 地址、机架号、槽号然后从 DB 块中按字节偏移读取数据。读取到的原始字节数组需要按 PLC 的数据类型解析比如 REAL 是 4 字节INT 是 2 字节字节序还有高位低位之分。解析完成的数据组装成簇送入队列最后由数据库入库循环写进 MySQL。这个架构要注意的是分层。Snap7 读取循环只管读和解析数据库写入循环只管落库两者通过队列解耦。PLC 扫描周期快数据库写入慢如果不用队列隔离两个环节相互拖累很快就会出现数据阻塞或者程序超时。6.4 从 MySQL 到报表与大屏数据库接好之后LabVIEW 本身也可以读取历史数据绘制趋势图。但如果公司要做 Web 大屏、企业驾驶舱这类可视化更合理的分工是让 Web 后端直接读 MySQL前端用 Grafana 或者 ECharts 展示。LabVIEW 专注采集和入库各司其职。这时候要注意账号权限最好给报表系统创建一个只读账号只授予 SELECT 权限。写入仍然走 LabVIEW 程序或者中间件网关避免账号泄露导致数据被随意篡改。6.5 关于“数据库同步软件”和时序数据库的延伸有朋友问到数据库同步软件这里简单给一句经验如果你的 LabVIEW 程序需要把数据从现场数据库同步到公司总部的数据库最省力的方案不是自定义程序去拉数据而是使用成熟的同步工具或者 MySQL 自带的复制机制。当然这类同步场景对网络稳定性要求很高现场数据量又大需要评估延迟和带宽。时序数据量如果特别大后续考虑把历史数据迁到专门的时序数据库比如 ClickHouse 或 InfluxDBMySQL 继续承担业务数据和近期数据的存储。数据量上来后架构演进是迟早的事。但对大多数测试系统和产线项目来说把 MySQL 这一环做扎实已经是能支撑几年的数据管理方案了。写到这里我最想说的其实很简单LabVIEW 和 MySQL 的组合不是高深的技术难题而是一个非常务实的数据管理选择。我第一次把几十万条测试记录从散乱文件搬进 MySQL 表时最直观的感受是同事们终于不用再围着硬盘找数据了。如果你正准备给自己的 LabVIEW 项目接数据库我的建议是先小步跑通用 Workbench 建好库表用 ODBC DSN 在 LabVIEW 里完成一次 INSERT 和一次 SELECT然后再谈批量写入、谈分表归档、谈网关架构。千万不要一上来就设计十几张表表多了以后 SQL 写不对排查成本远高于当初省下的时间。后面有几个扩展方向很值得尝试数据量大了之后把历史数据迁到分析型数据库在 LabVIEW 里封装一套 DB Client 公共库把连接、重试、日志统一起来方便多个项目复用在网关方案里把数据库账号从客户端电脑上彻底隐藏掉。这套链路只要搭稳了后面接大屏、接 MES、接远程监控都会顺畅很多。
返回列表