我在生产中遇到严重问题,导致应用程序没有响应,并输出以下错误:
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
操作系统:Heroku Linux(Ubuntu?)
最佳答案
最简单的方法是查看连接池级别上发生的事情是使用DEBUG=knex:*
环境变量集运行knex,这将打印knex中发生的大量调试信息。例如,这些日志显示连接何时从池中提取并返回到池中,以及每个运行的查询。
有两个全局事件可用于连接到每个查询,但没有任何全局事件可用于连接到事务。这里有一个相关的问题,我在这里编写了一些示例代码,如何使用查询钩子实际测量事务持续时间:Tracking DB querying time - Bookshelf/knex它可能会泄漏一些内存,因此它不是很适合生产的解决方案,但对于您的调试来说,它可能会有帮助。