Javascript nodejsmysql悄悄地失败了

Javascript nodejsmysql悄悄地失败了,javascript,mysql,node.js,node-mysql,Javascript,Mysql,Node.js,Node Mysql,我们正在node.js和mysql数据库(node-mysql2驱动程序)上构建一个实时GPS跟踪应用程序 该服务器是一个简单的TCP服务器,它接受来自GPS设备的传入数据,解析它们,然后写入mysql表。 GPS设备登录到服务器,保留一个套接字,然后开始发送位置(和其他)数据包。设备每10秒发送一次数据,每个数据包需要执行6次查询 它适用于多达100台左右的设备。但当尝试使用1000多台设备时,它开始悄无声息地失败。对于1000台设备,每秒的查询量将达到600多个 在大约700台设备登录并开始

我们正在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大小现在约为35GB)。这是一个非常简单的数据结构,有30个小数据行(500万行)。 从我们可以理解的情况来看,nodejs和mysql都不应该在这种负载下失败——每秒600-700次简单插入

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

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


PS我们正在Windows server 2008上运行此功能

我遇到了类似的问题。这个错误只是代码拼写错误(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);
    }

在我们尝试使用节点mysql连接池之前。但我们开始出现“未定义的无方法查询”或“未找到连接”类型错误。这可能与mysql中的最大连接设置有关吗?“未定义的无方法查询”看起来很像您没有检查第一个“err”参数。你能试着把它记录下来吗?主要的问题(“无声地不插入数据”)对我来说听起来很奇怪。如果您可以创建小型自包含测试,请将其添加为github问题,我将尝试调试(这里是mysql2作者),我们发现一些缺少的表出现了sql查询错误。我们现在已经解决了这个问题,正在观看应用程序。我们将很快给你一个详细的更新。非常感谢您在我们的查询中提供的信息。我们非常感谢您在mysql2上的工作。这对我们帮助很大。