【发布时间】:2020-03-15 02:25:55
【问题描述】:
我有一个Node.js 应用程序,在AWS RDS 上使用MySQL 和Bookshelf 和Knex 库。 RDS 实例有一个max_connections 值90。
我使用以下作为连接对象。
knex: {
client: 'mysql',
connection: {
host: 'xxxxxxx.rds.amazonaws.com',
user: 'xxx',
password: 'xxxxx',
database: 'xxxx',
charset: 'utf8'
},
debug: true,
pool: {
min: 2,
max: 20
},
acquireConnectionTimeout: 10000
},
const config = require('./environment');
const knex = require('knex')(config.knex);
module.exports = require('bookshelf')(knex).plugin('registry');
'use strict';
const bookshelf = require('../config/bookshelf');
const config = require('../config/environment');
module.exports = bookshelf.model(`TableA`, {
tableName: 'TableA'
}, {});
我的应用程序收到了许多请求,有时会因以下错误而崩溃。
未处理的拒绝 TimeoutError: Knex: Timeout getting a 联系。游泳池可能已经满了。你错过了一个 .transacting(trx) 调用?
和
错误:ER_CON_COUNT_ERROR:连接太多
我还看到服务器 PROCESSLIST 中有许多连接(平均为 40 到 50 个),Command 为 sleep。
我怀疑这些错误发生在服务器上的所有90 连接已完全使用/knex 尝试从池中获取新连接时。什么可能是解决此问题的永久解决方案,以及处理此类应用程序的最佳实践。
【问题讨论】:
-
可能值得提供有关创建和使用数据库连接的代码摘录。
-
更新了@RichChurcher,如果这是你的意思。谢谢
-
还有一个请求/查询超时的示例?
-
看起来每次您需要
../config/bookshelf时都会创建新的knex实例 -
您可以(并且应该)验证 RDS 最大连接限制是否生效。只需使用标准 RDS 监控并关注
DB Connections指标。另外,您是否在 AWS Lambda 上运行您的应用程序?这很容易让您同时运行数十个 lambda 调用,每个调用都打开与 RDS 的连接。
标签: mysql node.js amazon-rds knex.js bookshelf.js