【问题标题】:Nodejs MySQL failing silentlyNodejs MySQL静默失败
【发布时间】:2014-02-14 14:08:05
【问题描述】:

我们正在 node.js 和 mysql 数据库(node-mysql2 驱动程序)上构建实时 GPS 跟踪应用程序。

服务器是一个简单的 TCP 服务器,它接受来自 GPS 设备的传入数据,解析它们,然后写入 mysql 表。 GPS 设备登录到服务器,保留一个套接字,然后开始发送位置(和其他)数据包。设备每 10 秒发送一次数据,每个数据包需要执行 6 次查询。

它适用于多达 100 台左右的设备。但是当尝试使用 1000 个奇怪的设备时,它开始默默地失败。对于 1000 台设备,每秒最多会有 600 次奇数查询。

大约 700 台设备登录并开始发送数据后,我们的系统突然停止在 mysql 表中插入数据。它不会引发任何错误,显然服务器似乎运行良好。 服务器不断接受来自设备的数据并不断解析它们。我们的 console.log 语句执行,我们可以看到代码流正在执行到最后,根本没有抛出任何错误。 只是在某个时间点之后没有 mysql 插入(在我们的例子中,从开始大约 4-5 分钟,大约 700 台设备登录时)。

我们正在使用这种方式连接Mysql -

var mysql = require('mysql2');

var connection = mysql.createConnection({
    host        :   'localhost',
    port    :   3306,
    database    :   sample
    user        :   sample
    password    :   pwd
});

connection.connect(function(err) {
    if(err){console.log("couldnt connect to mysql" + err)};
    console.log("connected to mysql");
});


var sql_query1 = "SELECT `dt_tracker` FROM gs_tracker_data_"
            + imei + "  ORDER BY dt_tracker DESC LIMIT 1" ;

connection.query(sql_query1, function(err,rows,fields)
{
   if (err) { console.log("sql_query1 " + err); return; }
   if(rows.length != 0)
   {

    //processing
   }

});

var sql_query4 = "INSERT INTO gs_tracker_data_"
                                + imei
                                + " (`dt_server`, `dt_tracker`, `lat`, `lng`, " +
                                "`altitude`, `angle`, `speed`, `signal_gsm`, " +
                                "`signal_gps`, `offset`, `params`) VALUES ('"
                                + decoded_data.dt_server + "','"
                                + decoded_data.dt_tracker + "'," + decoded_data.lat
                                + "," + decoded_data.lng + ","
                                + 0 + "," + decoded_data.angle + ","
                                + decoded_data.speed + "," + decoded_data.signal_gsm
                                + "," + decoded_data.signal_gps + ","  + 0 + ",'"
                                + params + "')";

connection.query(sql_query4, function(err,rows)
{
  if (err) { console.log("sql_query4 " + err); return; }

});

Mysql 数据库中等大小(mysqldump 大小现在约为 35 GB)。这是一个非常简单的数据结构,有 30 个小表(500 万行)。 据我们所知,对于这种负载,nodejs 和 mysql 都不应该失败 - 每秒 600-700 次简单插入。

我们还使用 redis.io 来存储经常需要的静态数据。这部分似乎工作顺利。

关于我们应该检查什么有什么想法吗?

PS 我们在 Windows server 2008 上运行它

【问题讨论】:

  • 在我们尝试使用 node-mysql 连接池之前。但是我们开始收到“No method query for undefined”或未找到连接类型错误。这可能与mysql中的最大连接设置有关吗?
  • "No method query for undefined" 看起来很像你没有检查第一个 'err' 参数。你能试着记录一下吗?
  • 主要问题('默默地不插入数据')对我来说听起来很奇怪。如果您可以创建小型自包含测试,请将其添加为 github 问题,我将尝试调试(此处为 mysql2 作者)
  • 我们发现一些缺失的表出现了sql查询错误。我们现在已经解决了这个问题并观察了应用程序。我们将尽快为您提供详细的更新。非常感谢您在我们的查询中提供的信息。我们非常感谢您在 mysql2 上所做的工作。这对我们帮助很大。

标签: javascript mysql node.js node-mysql


【解决方案1】:

我也遇到过类似的问题。错误只是代码中的拼写错误(activeDb 在 'logger.info' 中拼写错误),导致 mysql connect 静默失败。

connection = mysql.createConnection(activeDB);
        connection.connect( error => {
            if (error) {
                logger.error("Database error: " + error);
                res.status(503).send(error);
            } 
            logger.info("Database " + activeDB.server);
            res.status(200).send("Connected to " + activeDB.server);
        });
    } catch (error) {
        logger.error("Database error ", error);
        res.status(503).send("Database connection problem " + error);
    }

【讨论】:

    猜你喜欢
    • 2011-04-07
    • 2021-10-04
    • 2017-01-10
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多