我在生产中遇到了严重问题,导致应用程序无响应并输出以下错误:
Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
一个连续的假设是某些操作会保留长时间运行的Knex事务。基本上,它们足以达到池的大小。
transaction
和transacting
?另一有用的事情是记录任何事务的调用堆栈(或超过7秒)。挑战之一是我在整个项目中都致电Knex transaction
和transacting
。也许是一个远景。任何建议都将不胜感激。
系统信息
答案 0 :(得分:1)
最容易看到的是,在连接池级别上发生的事情是运行带有DEBUG=knex:*
环境变量集的knex,它将打印出很多调试信息,这些信息在knex内部发生了什么。例如,这些日志显示从池中获取连接并将其返回到连接时以及每次运行查询时的情况。
您可以使用几个全局事件来关联每个查询,但是没有任何事件可以关联到事务。这是一个相关的问题,我在其中写了一些示例代码,尽管该示例代码如何使用查询挂钩实际测量事务持续时间:Tracking DB querying time - Bookshelf/knex可能会泄漏一些内存,因此它不是非常适合生产的解决方案,但出于调试目的,可能会有所帮助