在 Socket IO 和 Node JS 中轮询 MySQL DB
Poll MySQL DB in Socket IO & Node JS
我试图通过每 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);
});
});
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', ' ');
}
我试图通过每 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);
});
});
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', ' ');
}