Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js-监视数据库的更改_Node.js - Fatal编程技术网

Node.js-监视数据库的更改

Node.js-监视数据库的更改,node.js,Node.js,我正在使用node.js服务器在我的web应用程序和数据库之间创建一个“接近实时”的套接字。目前我正在使用MySQL,我在节点中每秒轮询一次,以检查表是否有任何更改(基于时间戳) 我想知道是否有任何特定的技术可以用MySQL做类似的事情?目前,我正在运行一个SQL查询,并在下次轮询之前使用setTimeout 我知道在这种情况下使用NoSQL数据库更为常见,但我对这项技术不太熟悉,我更愿意使用SQL 是否有人有使用node监视SQL数据库的经验或技巧 我个人不会为此使用轮询机制。我认为这是一个非

我正在使用node.js服务器在我的web应用程序和数据库之间创建一个“接近实时”的套接字。目前我正在使用MySQL,我在节点中每秒轮询一次,以检查表是否有任何更改(基于时间戳)

我想知道是否有任何特定的技术可以用MySQL做类似的事情?目前,我正在运行一个SQL查询,并在下次轮询之前使用setTimeout

我知道在这种情况下使用NoSQL数据库更为常见,但我对这项技术不太熟悉,我更愿意使用SQL


是否有人有使用node监视SQL数据库的经验或技巧

我个人不会为此使用轮询机制。我认为这是一个非常好的使用案例,pub/sub mq作为数据库顶部的组件,允许使用者订阅特定的通道,以获取他们关心的实体上的更改事件

例:

  • 有人要求更改模型
  • 模型广播更改事件
  • 将要保留在数据库中的更改排队
  • 在消息队列中的特定通道上触发更改集,以分发给所有相关方
  • 您可以使用节点EventEmitter为这类事情使用非常简单的进程内发布/订阅机制,当您需要扩展、具有耐用性要求或需要跨语言MQ时,您可以使用rabbitmq、zeromq等技术。我已经开始在我的一个应用程序中实现一些非常轻量级的功能:

    这可以归结为:

    pubsub.sub('users.*', function(updates){
        // Interested party handles updates for user objects
    });
    
    这样,您就不会对数据库施加愚蠢的轮询压力。事实上,更改分发完全独立于写入数据库


    Josh

    我同意@Josh给出的答案,但是如果出于任何原因,您被迫监视MySQL数据库的状态,那么最好在服务器端执行任何轮询,以显著降低服务器上的负载。我使用的一种技术是创建一个存储过程,该存储过程在睡眠状态下监视某些查询结果N次

    DELIMITER //
    
    CREATE PROCEDURE waitForResults(OUT c INT)
    BEGIN
      DECLARE n INT DEFAULT 20;
      DECLARE x INT;
    
      WHILE n > 0 DO
        SELECT SLEEP(0.5) INTO x;
        SELECT COUNT(*) FROM `jobs` INTO c;
        IF (c > 0) THEN SET n = 0;
        ELSE SET n = n - 1;
        END IF;
      END WHILE;
    
    END //
    
    DELIMITER ;
    

    然后,可以在该存储过程返回时查询数据库。知道某些内容已更改,然后再次调用该过程以等待结果。

    我将使用内存(堆)存储引擎。然后保持一个打开的连接和查询更改都发生在RAM(内存)中,这是非常快的,应该可以。这会阻止我在其他地方正常使用该表吗?我需要能够正常地在我的应用程序中的其他地方查询相同的表。一点也不。但是,当服务器关闭(或者mysqld停止)时,所有数据都会丢失。这意味着,如果您想保持数据的持久性,您可能需要在一段时间内或使用某种逻辑将其保存到另一个表中一个完全不同的工具集,但最接近您想要的。您可以重新考虑切换到具有pubsub机制(Redis、CouchDB)的数据库。