【问题标题】:Node.js SQL server crashes when receiving multiple requestsNode.js SQL 服务器在收到多个请求时崩溃
【发布时间】:2018-02-16 12:28:48
【问题描述】:

我有一个 NodeJS 应用程序,它是我的服务器,我创建了一个数据库类来帮助我处理查询我的 SQL DB。如果我在彼此之间发送一秒钟的请求,一切都运行良好.. 没问题.. 但是如果我开始向我的服务器发送垃圾邮件请求,它会因Error: Cannot enqueue Quit after invoking quit.

而崩溃

这是我的数据库类中的查询函数

static query(query: string): Promise<any> {
    console.log('Query: ' + query);
    return new Promise((resolve, reject) => {
        this.connect().then(success => {
            sqlConn.query(query, (err, results) => {
                if (err) { return reject(err);
                } else {
                    return resolve(results);
                }
            });
        }).catch(err => {
            return reject(err);
        }).then( () => {
           if (sqlConn.state !== 'disconnected') {
            sqlConn.end();
           }
        });
    });
};

这是this.connect() 函数

static connect(): Promise<any> {
    return new Promise((resolve, reject) => {
        sqlConn = mysql.createConnection(this.connectionData);
        sqlConn.connect(err => {
            if (err) { return reject(err); } else {
                return resolve('SQL connection established');
            }
        });
    });
};

我很确定问题有时会出现,但它仍然会 处理一个查询,然后另一个查询出现在第一个查询之前 一个完成,所以它会调用sqlConn.end() 两次,即使它是 已经断开连接?非常感谢任何帮助...

> 主要目标是让查询等到 100% 完成后再运行 下一个..

【问题讨论】:

  • 为什么你不为 mysql 连接定义一个池大小,我认为这可能会解决你的问题......并使用相同的连接进行第二次查询并设置一些空闲时间来结束你的连接
  • 看看mysql npm模块的这一部分:npmjs.com/package/mysql#pooling-connections 你应该做的是从池中获取一个连接,执行查询,然后释放连接回查询。获取函数将在解决承诺之前自动等待空闲连接(或超时拒绝)。

标签: sql-server node.js typescript nodemon


【解决方案1】:

如果您真的想使用这种方法,请使用 async 库的 eachSeries 函数。

var chunkedArray= [];
async.eachSeries(chunkedArray, startUpload, endUpload);

funtion startUpload(data,cb){
    //iterate over every single item in array 1 at a time
    }

function endUplaod(err){

//finally call this
}

这可能会有所帮助:- https://caolan.github.io/async/docs.html#eachSeries

但我宁愿建议您使用连接池,这样可以减少数据库的开销,并且您可以更有效地使用 mysql,然后进行多个连接。

// Load module
var mysql = require('mysql');
// Initialize pool
var pool      =    mysql.createPool({
    connectionLimit : 10,
    host     : '127.0.0.1',
    user     : 'root',
    password : 'root',
    database : 'db_name',
    debug    :  false
});    
module.exports = pool;

【讨论】:

    【解决方案2】:

    您可以通过使用 npm 模块 mysql 并使用它的内置连接池来简化您的代码。

    来自the documentation

    var mysql = require('mysql');
    var pool  = mysql.createPool({
      connectionLimit : 10,
      host            : 'example.org',
      user            : 'bob',
      password        : 'secret',
      database        : 'my_db'
    });
    
    pool.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
      if (error) throw error;
      console.log('The solution is: ', results[0].solution);
    });
    

    当然,您可以创建自己的函数来承诺该调用,如下所示:

    function query (sql) {
      return new Promise((resolve, reject) => {
        pool.query(sql, (error, results, fields) => 
          error ? reject(error) : resolve({ results, fields });
      };
    }     
    

    【讨论】:

      猜你喜欢
      • 2015-07-23
      • 2022-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多