【问题标题】:Poll MySQL DB in Socket IO & Node JS在 Socket IO 和 Node JS 中轮询 MySQL DB
【发布时间】:2016-02-19 12:12:37
【问题描述】:

我试图通过每 2 秒迭代一次并检索不到 2 秒前创建的所有记录来轮询 MySQL 数据库。

如果我使用setInterval,它似乎偶尔会错过记录。如果我使用setTimeout,它只会获取第一次迭代。

如何更可靠地获取数据以包含所有数据?

io.on('connection', function(socket) {
    authorize (socket, function(shop_id) {
        setInterval(function() {
            var sql = "SELECT * FROM `stats` WHERE `shop_id` = " + connection.escape(shop_id) +
            " AND `created` > DATE_SUB(NOW(), INTERVAL 2 SECOND)";
            var query = connection.query(sql, function(err, rows, fields) {
                if (err == null) {
                    console.log (rows);
                    socket.emit('newData', rows);
                }
            });
        }, 2000);
     });
});

【问题讨论】:

    标签: javascript mysql node.js socket.io


    【解决方案1】:

    MySQL 并非设计为每 2 秒拉一次。这不是 godo 系统架构,您以后会遇到更多问题,尤其是在可扩展性方面。

    setInterval 不精确,不保证它会休眠 2000 毫秒,它可能会休眠 2001、2200 甚至 50 小时。

    要解决此问题,请将您的 NodeJS 脚本获取的最新 created 存储在一个变量中,并获取在您上次收到 created 之后创建的所有行。这将获取每条记录,并且不会丢失记录。

    io.on('connection', function(socket) {
    
    
     authorize (socket, function(shop_id) {
            setInterval(function() {
                var lastCreated = toMySQLDate(new Date());
                var sql = "SELECT * FROM `stats` WHERE `shop_id` = " + connection.escape(shop_id) +
                " AND `created` > " + lastCreated + " ORDER BY `created` DESC";
                var query = connection.query(sql, function(err, rows, fields) {
                    if (err == null) {
                        if (rows.length) {
                            lastCreated = toMySQLDate(rows[0].created);
                        }
                        console.log (rows);
                        socket.emit('newData', rows);
                    }
                });
            }, 2000);
         });
    });
    
    function toMySQLDate(date) {
        return date.toISOString().slice(0, 19).replace('T', ' ');
    }
    

    【讨论】:

    • toMySQLDate() 也需要在更新lastCreated 的地方使用。它不会让我编辑代码示例。 SQL中的拼写错误=应该是+
    • stats 数据不一定与数据库中的其他表相关。对于扩展的频繁轮询,什么是更好的数据存储选择?
    猜你喜欢
    • 2014-10-18
    • 2018-12-13
    • 2017-08-07
    • 2015-12-24
    • 2014-05-24
    • 2015-06-14
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    相关资源
    最近更新 更多