【问题标题】:Machine monitoring application ( mysql )机器监控应用程序(mysql)
【发布时间】:2016-01-13 16:36:36
【问题描述】:

我正在为一台机器构建一个监控应用程序,必须每秒读取一次位置并存储一个月。我写了一个程序来填充一个初始值为 0 的表格。

CREATE DEFINER=`root`@`localhost` PROCEDURE `new_procedure`(start_date datetime, end_date datetime)
BEGIN

DECLARE interval_var INT DEFAULT 1;

    WHILE end_date >= start_date DO

        INSERT INTO table1(datetime, value) VALUES(start_date, 0);
        SET start_date = DATE_ADD(start_date, INTERVAL interval_var SECOND);

    END WHILE;

END

这个过程很慢,大部分时间和sql数据库的连接都丢失了。例如,当我尝试将表格从“2016-01-14 07:00:00”填充到“2016-01-15 07:00:00”时,程序到达 2016-01-14 07:16:39 和由于失去与数据库的连接而崩溃。

有没有更有效的方法来创建一个月的模板表,其中包含第二个增量和 0 值?我的监控应用程序是在 vb.net 上构建的,我尝试在 vb 上创建代码来创建此模板表,但它比 mysql 工作站上的直接过程更慢且更容易崩溃。

【问题讨论】:

  • 您应该能够使用准备好的查询来执行此操作,该查询旨在准备一次并运行多次。尽管您的存储过程也应该可以解决问题。

标签: mysql datetime stored-procedures scada


【解决方案1】:

我建议先查看应用程序架构。期望整个系统在整个月内运行甚至 1 秒都不会出现故障,这要求非常高。另外,试着想想你是否真的需要这么多数据。

1 条记录/秒*3600 秒/小时*24 小时/天*30 天/月超过 310 万条记录。试图处理这么多信息会导致很多软件阻塞。

如果测量是离散的,您可以通过仅在数据库中记录更改来显着减少这种情况。如果是模拟的,你可能别无选择。

我建议创建两个独立的应用程序:一个存储本地数据的本地监视器,然后每隔一小时左右向 mysql 服务器应用程序报告。这样,如果数据库不可用,它会继续收集数据,当数据库再次可用时,它可以传输自上次连接以来记录的所有内容。然后mysql应用就可以一键将数据存入数据库。如果失败,它可以重试,并保留它自己的数据副本,直到它被存储到数据库中。

例如:

机器 => 监控站应用 => mysql 应用 => mysql 数据库

这需要更多的工作,但每个应用程序都非常小,甚至可以重复使用。它将使故障排除变得更加容易,并显着提高系统的容错能力。

【讨论】:

    猜你喜欢
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    相关资源
    最近更新 更多