我有一个Node.js
应用程序使用 MySQL
在AWS RDS
上与 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'
}, {});
我的应用程序收到许多请求,有时会因以下错误而崩溃。
Unhandled rejection TimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
和
Error: ER_CON_COUNT_ERROR: Too many connections
我还看到服务器中有许多连接(平均 40 到 50 个)PROCESSLIST
与 Command
如sleep
。
我怀疑当所有90
时发生这些错误服务器上的连接已完全使用/knex 在尝试时无法从池中获取新连接。什么可能是永久解决方案,以及处理此类应用程序的最佳实践。
最佳答案
我不认为是 RDS max_connections
导致了该问题,假设您在任何时候都只运行上述应用程序代码的一个实例。
您的应用程序使用数据库连接池,最多可容纳 20 个连接。如果所有这些连接都在使用中,则应用程序将等待 acquireConnectionTimeout
毫秒(在您的情况下),即连接超时之前的 10000
毫秒。
所以我怀疑您的应用程序要么由于负载而需要处理大量数据库查询,要么有一些缓慢的查询占用连接。这会导致等待连接的查询积压,最终超时。调查可能的情况并向我们通报最新情况。
同时您可以尝试的事情。
- 增加
acquireConnectionTimeout
。 - 增加连接池大小。
如果是由缓慢查询引起的,请在尝试上述操作之前对其进行优化。
记录慢速查询的可能方法:
- 在 RDS 上启用慢查询日志。
- 克内克斯 query假设您正在使用事务,则记录事务持续时间的事件。
关于mysql - 如何在 RDS 上正确使用 Knex/Bookshelf 和 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58936225/