已超出“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 的区别
我如何解决 MySQL 中的“max_user_connections”问题?