如何检测和记录我的KnexJS交易?

时间:2018-07-12 13:46:55

标签: node.js postgresql knex.js

我在生产中遇到了严重问题,导致应用程序无响应并输出以下错误:

Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?

一个连续的假设是某些操作会保留长时间运行的Knex事务。基本上,它们足以达到池的大小。

  1. 是否可以查询KnexJS API一次是否正在使用多少个池连接?不幸的是,由于KnexJS占用了配置中的最大池设置,因此可能很难知道实际使用了多少个。从postgres端看,似乎KnexJS在不使用所有连接时都处于空闲状态。
  2. 是否可以使用某种中间件或挂钩来检测Knex transactiontransacting另一有用的事情是记录任何事务的调用堆栈(或超过7秒)。挑战之一是我在整个项目中都致电Knex transactiontransacting。也许是一个远景。

任何建议都将不胜感激。


系统信息

  • KnexJS版本::0.12.6 (我们将在下个月更新)
  • 数据库+版本: Postgres 9.6
  • 操作系统:Heroku Linux(Ubuntu?)

1 个答案:

答案 0 :(得分:1)

最容易看到的是,在连接池级别上发生的事情是运行带有DEBUG=knex:*环境变量集的knex,它将打印出很多调试信息,这些信息在knex内部发生了什么。例如,这些日志显示从池中获取连接并将其返回到连接时以及每次运行查询时的情况。

您可以使用几个全局事件来关联每个查询,但是没有任何事件可以关联到事务。这是一个相关的问题,我在其中写了一些示例代码,尽管该示例代码如何使用查询挂钩实际测量事务持续时间:Tracking DB querying time - Bookshelf/knex可能会泄漏一些内存,因此它不是非常适合生产的解决方案,但出于调试目的,可能会有所帮助