繁体   English   中英

Node.JS和MySQL-查询锁定并执行得非常慢

[英]Node.JS and MySQL - queries lock up and execute extremely slowly

使用此驱动程序使用Node.JS和MySQL时出现奇怪的行为-https: //github.com/mysqljs/mysql

本质上,我在前端有一个按钮,可触发一个app.get在数据库中进行查询,并且我可以在后端愉快地使用结果。

效果很好,直到我每秒按下按钮4-5次,此时查询被锁定,我不得不等待2-3分钟,直到它们继续执行。 我有一个类似的写函数,其行为方式相同。

这可能是一个问题,因为我正在尝试异步执行完全相同的查询吗? 即我必须从前端限制它,还是后端问题?

关于如何调试到底发生了什么的任何想法?

// database.js

var mysql = require('mysql');

var pool  = mysql.createPool({
    connectionLimit: 100,
    host     : 'localhost',
    user     : 'secret',
    password : 'secret',
    database : 'mydb'
});

exports.getConnection = function(callback) {
    pool.getConnection(function(err, connection) {
        callback(err, connection);
    });
};

// dbrw.js
var con = require('../config/database');

function read(id, done) {
    con.getConnection(function(err, connection){
        if(!err){
            connection.query("SELECT * FROM users WHERE id = ?",[id], function(err, rows) {
            connection.release();
                if (err)
                    done(err);
                if (rows.length) {
                    console.log("rows " + JSON.stringify(rows));
                    done(rows[0].progress);
                };
            });
        }
        else {
            console.log(err);
        }
    });
}

exports.read = read;

// routes.js
var dbrw = require('./dbrw.js');

app.get('/read', isLoggedIn, function(req, res) {
    dbrw.read(req.user.id, function(result) {
    console.log(result);
    });
});

// Frontend - angular app.js

$scope.tryread = function() {
    $http.get('/read');
}

预先感谢您的任何投入。

我看到一些问题:

function read(id, done) {
    con.getConnection(function(id, connection){...}
}

请注意,如何通过将相同的名称赋予getConnection回调的参数来覆盖传递给readid

此外,您的Express路由实际上不会通过发送回响应来结束请求,这会使您的浏览器超时连接。 在某些时候,它甚至会拒绝发送更多的请求,因为仍有太多请求等待处理。

因此,请确保结束请求:

app.get('/read', isLoggedIn, function(req, res) {
    dbrw.read(req.user.id, function(result) {
      console.log(result);
      res.end(); // or `res.send(result)`
    });
});

提示:您应该对Node使用回调调用conversion的回调,其中第一个参数表示错误(如果有),第二个参数表示返回值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM