已超出“max_user_connections”资源

Posted

技术标签:

【中文标题】已超出“max_user_connections”资源【英文标题】:has exceeded the 'max_user_connections' resource 【发布时间】:2017-01-02 04:50:36 【问题描述】:

我有一个 mysql、Express、Angular、NodeJS 应用程序,有时当我登录时,我的节点控制台中会出现以下错误:

TypeError:无法读取未定义的属性“查询”

错误发生在我的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)

【问题讨论】:

也许你产生了太多的进程。确保在完成后关闭任何连接。 【参考方案1】:

您遇到的错误说明了问题:您的 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);
  ...
);

【讨论】:

感谢您的提示。不过,我确实有 2 个问题。增加最大连接数是否有负面影响,您是否认为我的代码中有错误导致与数据库的连接泛滥? @PeterBoomsma 我不认为您正在用连接淹没数据库,只是允许的最大连接数与池将(懒惰地)打开的连接数完全相同。如果mysql 碰巧打开了一个额外的连接(无论出于何种原因),您将遇到该限制。增加到,比如说,20,应该就足够了。除非您的硬件功能严重不足,否则我认为不会产生负面影响。 我在 Heroku 上有我的 MySQL 数据库。猜猜我需要在那个平台上配置数据库。我只是在自己的配置中更改了值,但仍然出现错误。 @PeterBoomsma 或者,您可以尝试降低连接池的connectionLimit 值。 对于 Heroku:尝试重新启动您的测功机。【参考方案2】:

我假设您的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。

【讨论】:

以上是关于已超出“max_user_connections”资源的主要内容,如果未能解决你的问题,请参考以下文章

mysql 的max_connections和max_user_connections 的区别

max_user_connections参数设置试验

我如何解决 MySQL 中的“max_user_connections”问题?

无法使用 MAX_USER_CONNECTIONS 在 MariaDB 中创建用户

OData 异常已超出 Top 查询的“0”限制

请求无法完成,因为您已超出配额