已超出'max_user_connections'资源

时间:2016-08-25 16:41:32

标签: mysql node.js express

我有MySQL,Express,Angular,NodeJS应用程序,有时当我登录时,我的节点控制台出现以下错误:

  

TypeError:无法读取未定义

的属性'query'

错误发生在我的passport.local.js文件中,这是一行:

connection.query('SELECT * FROM users WHERE username LIKE ?', [username], function (err, user) {

这是护照功能

passport.use(new LocalStrategy(
    function(username, password, done) {

        console.log('app.js');

        pool.getConnection(function(err, connection) {

            console.log('err: ' + err);
            console.log(connection);    

            connection.query('SELECT * FROM users WHERE username LIKE ?', [username], function (err, user) {
                if (err) throw err;

                for (var i = user.length - 1; i >= 0; i--) {
                    var current = user[i];
                }

                if(current){
                    if(bcrypt.compareSync(password, current.password)){
                        return done(null, user);
                    } else {
                        return done(null, false);
                    }
                } else {
                    console.log('no user');
                    return done(null, false);
                }
            });

            connection.release();
        });
    }
));

我在文件顶部需要pool

var pool = require('../../config/connection');

发生错误时:

console.log(connection);  

获取:

  

未定义

我也记录错误:

console.log('err: ' + err);

显示:

 err: Error: ER_USER_LIMIT_REACHED: User 'bfe4a8980ede74' has exceeded the 'max_user_connections' resource (current value: 10)

2 个答案:

答案 0 :(得分:3)

您收到的错误是说明问题:您的MySQL服务器只允许每个用户连接10个,并且已达到该限制。

default for the mysql connection pool也恰好是10,这真的很接近。如果Express应用程序以外的任何其他MySQL客户端使用相同的用户凭据连接到数据库,则可能会遇到该特定错误。我建议在MySQL配置中增加max_user_connections

除此之外,您的代码还有另一个问题:它在查询完成之前释放连接,这可能会导致意外行为。将呼叫移至connection.release()以进入回调:

pool.getConnection(function(err, connection) {
  ...
  connection.query('SELECT * FROM users WHERE username LIKE ?', [username], function (err, user) {
    connection.release();
    ...
  });
});

如果这是您使用MySQL的常用方式(获取连接,执行查询,释放连接),则可以使用pool.query()来简化生活。请参阅this example

最后,如果您正在使用异步代码,请不要抛出错误,而是将它们传递给回调(并确保您实际处理它们,因为您没有处理来自pool.getConnection的任何错误现在,除了记录它们之外):

pool.getConnection(function(err, connection) {
  if (err) return done(err);
  ...
});

答案 1 :(得分:3)

我假设您的max_user_connections设置为10.请提高max_user_connection值。

show global variables like '%connections%'; 

将帮助您提供已设置的连接数。增加连接数如果它少于25或50.我猜最大连接数可能超过16000,这一切都取决于你的cpu,没有线程它可以处理等。

SET GLOBAL max_user_connections=100;

max_user_connections是一个动态变量,这意味着您可以直接运行此查询。你不必关闭mysql。