Mysql 有没有更好的方法在不使用setInterval()函数的情况下侦听节点JS中的表更改

Mysql 有没有更好的方法在不使用setInterval()函数的情况下侦听节点JS中的表更改,mysql,node.js,sockets,setinterval,Mysql,Node.js,Sockets,Setinterval,我正在学习与Codeigniter集成的Node JS。这个过程运行得非常完美 当数据库(MySql)中发生某些更改时,我会显示一些实时通知。 现在我正在使用setInterval()函数,时间为5秒。这将在每5秒内调用DB查询 没有setInterval()功能,有没有更好的方法来监听数据库更改? 我的代码示例是 io.on('connection', function(socket){ setInterval(check_new_notification, 5000); }); s

我正在学习与
Codeigniter
集成的
Node JS
。这个过程运行得非常完美

当数据库(MySql)中发生某些更改时,我会显示一些实时通知。

现在我正在使用
setInterval()
函数,时间为5秒。这将在每5秒内调用DB查询

没有
setInterval()
功能,有没有更好的方法来监听数据库更改?

我的代码示例是

io.on('connection', function(socket){
    setInterval(check_new_notification, 5000);
});

socket.on('check_new_notification', function(user,time){
    check_new_notification(user,time);
});

function check_new_notification(user,time){
    if(user == '' || typeof user == 'undefined' || user == null){
        user = user_id;
    }
    if(time == '' || typeof time == 'undefined'){
        time=0;
    }
    if(user != '' && typeof user != 'undefined' && user != null){
        db.getDetails(user,time,mysql,pool,function(error,result,row_count){
            io.emit('trigger_alert',result, row_count);
        });
    }
}

请让我知道是否有更好的方法来收听数据库更改。任何帮助都将不胜感激。

在您的情况下,无法避免主动轮询。 所以你的方法基本上是正确的

要提高性能,请执行以下操作:

  • 创建一个带有布尔字段的表
    status
  • 如果发生了某些事件,请将
    状态设置为true
  • 读取Node.js中的
    状态
  • 如果为true:执行选择并将
    状态设置为
    false
  • 如果错误:什么也不做

确保您的操作是原子的->使用事务。

您应该在创建通知的地方实现通知功能。例如,当插入数据库行时,让应用程序将消息推送到队列中。然后,应用程序可以订阅队列,并在插入新行时进行更新。您也可以选择通过消息队列发送完整的通知。

MySQL是否支持此类实时通知?作为补充说明,您可能不必通过多种方式测试变量的真实性()。一个简单的
if(shouldbe&&!shouldnotbe)
应该可以让代码更具可读性。如果他控制将数据推送到DB服务器的代码,这是一个很好的建议;从他的问题上我不清楚。该应用程序可能正在监视另一个(或多个)应用程序正在使用的数据库。