我如何检测和记录我的 KnexJS 交易?
How can I instrument and log my KnexJS transactions?
我在生产中遇到严重问题,导致应用程序无响应并输出以下错误:
Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
一个 运行 假设是一些操作持有长期 运行 Knex 交易。基本上足以达到池大小。
- 有没有一种方法可以查询 KnexJS API 一次有多少个池连接正在使用? 不幸的是,因为 KnexJS 占用了最大池设置配置,可能很难知道实际使用了多少。从 postgres 端看,KnexJS 似乎在所有未使用的连接上都处于空闲状态。
- 是否有使用某种中间件或钩子检测 Knex
transaction
和 transacting
的好方法? 另一个有用的方法是记录调用堆栈任何交易(或任何超过 7 秒的时间)。一个挑战是我在整个项目中都调用了 Knex transaction
和 transacting
。也许这是一个远景。
非常感谢任何建议。
系统信息
- KnexJS版本:0.12.6(下个月更新)
- 数据库+版本: Postgres 9.6
- OS: Heroku Linux (Ubuntu?)
最简单的方法是查看连接池级别发生的情况是 运行 knex 设置了 DEBUG=knex:*
环境变量,这将打印相当多的调试信息 knex 内部发生的情况。例如,这些日志显示了何时从池中获取连接并返回到那里以及每个 运行 查询。
有几个全局事件可用于连接到每个查询,但没有任何事件可用于连接到 t运行saction。这是一个相关的问题,我在其中编写了一些示例代码如何使用查询挂钩实际测量 t运行saction 持续时间: 它可能会泄漏一些内存,因此它不是非常适合生产的解决方案,但对于您调试目的可能会有帮助。
我在生产中遇到严重问题,导致应用程序无响应并输出以下错误:
Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
一个 运行 假设是一些操作持有长期 运行 Knex 交易。基本上足以达到池大小。
- 有没有一种方法可以查询 KnexJS API 一次有多少个池连接正在使用? 不幸的是,因为 KnexJS 占用了最大池设置配置,可能很难知道实际使用了多少。从 postgres 端看,KnexJS 似乎在所有未使用的连接上都处于空闲状态。
- 是否有使用某种中间件或钩子检测 Knex
transaction
和transacting
的好方法? 另一个有用的方法是记录调用堆栈任何交易(或任何超过 7 秒的时间)。一个挑战是我在整个项目中都调用了 Knextransaction
和transacting
。也许这是一个远景。
非常感谢任何建议。
系统信息
- KnexJS版本:0.12.6(下个月更新)
- 数据库+版本: Postgres 9.6
- OS: Heroku Linux (Ubuntu?)
最简单的方法是查看连接池级别发生的情况是 运行 knex 设置了 DEBUG=knex:*
环境变量,这将打印相当多的调试信息 knex 内部发生的情况。例如,这些日志显示了何时从池中获取连接并返回到那里以及每个 运行 查询。
有几个全局事件可用于连接到每个查询,但没有任何事件可用于连接到 t运行saction。这是一个相关的问题,我在其中编写了一些示例代码如何使用查询挂钩实际测量 t运行saction 持续时间: