mysql - 如何在 RDS 上正确使用 Knex/Bookshelf 和 MySQL

标签 mysql node.js amazon-rds knex.js bookshelf.js

我有一个Node.js应用程序使用 MySQLAWS RDS上与 Bookshelf & Knex图书馆。 RDS 实例有 max_connections90 。 我使用以下内容作为连接对象。

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 个)PROCESSLISTCommandsleep

我怀疑当所有90时发生这些错误服务器上的连接已完全使用/knex 在尝试时无法从池中获取新连接。什么可能是永久解决方案,以及处理此类应用程序的最佳实践。

最佳答案

我不认为是 RDS max_connections 导致了该问题,假设您在任何时候都只运行上述应用程序代码的一个实例。

您的应用程序使用数据库连接池,最多可容纳 20 个连接。如果所有这些连接都在使用中,则应用程序将等待 acquireConnectionTimeout 毫秒(在您的情况下),即连接超时之前的 10000 毫秒。

所以我怀疑您的应用程序要么由于负载而需要处理大量数据库查询,要么有一些缓慢的查询占用连接。这会导致等待连接的查询积压,最终超时。调查可能的情况并向我们通报最新情况。

同时您可以尝试的事情。

  • 增加 acquireConnectionTimeout
  • 增加连接池大小。

如果是由缓慢查询引起的,请在尝试上述操作之前对其进行优化。

记录慢速查询的可能方法:

  • 在 RDS 上启用慢查询日志。
  • 克内克斯 query假设您正在使用事务,则记录事务持续时间的事件。

关于mysql - 如何在 RDS 上正确使用 Knex/Bookshelf 和 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58936225/

相关文章:

sql - Node.js SQL Server 代码似乎有误,但仍然有效?

java - 无法从 Amazon EC2 ubuntu 16.04 镜像连接到 Amazon RDS 上的数据库

mysql - codeigniter迁移错误外键约束

java - 从Android发送时间数据类型到mySQL数据库

javascript - 测试 React 项目时 npm test 有效,但 jest 不起作用

javascript - 如何在 node.js 的 http 响应中获取主机名?

mysql - AWS Aurora 与 MySQL 的兼容性

postgresql - 从另一个 VPC 访问私有(private) RDS 数据库

mysql - 不像 MySQL 语句

php - prestashop 的 Bad SubDomain SQL 查询错误