【问题标题】:node-mysql pool and socket.ionode-mysql 池和 socket.io
【发布时间】:2013-04-25 15:46:17
【问题描述】:

我目前正在为我的应用程序上的所有用户使用单个 mysql 连接。 我想开始使用一个池(它应该更优化,对吧?)但我有一个“结构”问题:createPool 方法只适用于回调,我不明白如何通过与 socket.io 事件的连接。

我的意思是,在 server.js 文件中有一个建立连接的点

pool.getConnection(function(err, connection) {
    //I'm supposed to use the connection here
}

然后有一个套接字事件被“捕获”

io.sockets.on('connection', function(socket){
    socket.on('userLogin', function(id_user){
        //I need the connection here to run a query with 'id_user'!
    });
});

在第二点我需要连接,然后我可以运行

connection.query('SELECT bla bla bla...', function(err, data){
    connection.end();
});

我认为这是为每个连接到应用程序的用户建立不同连接的唯一方法,但我真的不明白如何将连接“传递”到 socket.io“空间”。

【问题讨论】:

    标签: mysql node.js socket.io


    【解决方案1】:

    在需要时向池请求连接:

    var pool = mysql.createPool(...);
    
    io.sockets.on('connection', function(socket) {
    
      socket.on('userLogin', function(id_user) {
        pool.getConnection(function(err, connection) {
          // assuming err was null here...
          connection.query(..., function(err, data) {
            // return the connection to the pool as soon as possible
            connection.end();
    
            // process data
            ...
          });
        });
      });
    });
    

    由于池化,pool.getConnection() 是一个非常便宜的调用,因此当您按需调用它时影响不大。

    【讨论】:

    • 好的,但假设我需要在我的 'userLogin' 事件(或另一个事件)中运行 setInterval 以不断检查有关我的用户的信息。我需要在每个滴答声中调用“getConnection”和“end”吗?我的意思是……我必须每 5 秒创建和销毁一次连接吗?!
    • 您不是每 5 秒破坏一次连接,而是从池中获取一个连接(并在完成后将其归还)。另一种方法是为每个客户端创建一个连接,这不是很可扩展。
    • 我几天前已经测试过这个解决方案,但我总是遇到很多“读取 ETIMEDOUT”错误。我再试一次……
    • 我想这取决于导致这些超时的确切原因。
    • 情况非常相似。在“userLogin”事件中,我有一个 setInterval 循环,其中调用 getConnection,调用 connection.end,然后处理数据。有 6 个 socket.io 事件,有 6 个 setInterval 循环在请求时开始。它一直有效,直到有用户在线。如果有一个没有任何用户的时间段,则会出现“读取 ETIMEDOUT”错误!
    猜你喜欢
    • 2016-12-18
    • 2011-10-07
    • 1970-01-01
    • 2012-07-16
    • 2016-05-25
    • 2015-02-11
    • 2022-12-02
    • 1970-01-01
    • 2014-09-25
    相关资源
    最近更新 更多