我的Knex驱动程序出现间歇性错误:
TimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
我猜想,我的RDS Aurora实例暂时无法从服务器访问,或者我的连接池在流量特别繁忙时耗尽了。我想在连接池中记录可用连接与已占用连接的关系并绘制图表,以查看我的连接确实用完了,以及连接使用量激增时是否存在特定问题。但是我似乎无法从Google找出是否有办法从Knex或其池管理器中获取可用连接的数量。这可能吗?如果没有,是否还有其他方法可以记录有关我的连接池的统计信息?
我看到有一个选项可以传递给连接池初始化log
,它需要一个布尔值。我正在使用Winston
将日志传送到Loggly,而不仅仅是传送stdout的内容。我不知道“ log”属性会记录我感兴趣的事件,但是无论如何我都需要将该信息作为数据来获取,以便我可以有意义的方式将其发送给Loggly。
答案 0 :(得分:2)
通过运行设置了环境变量DEBUG=knex:*
的应用程序,您可以了解一些有关如何获取/返回连接的信息。
Knex使用tarn.js作为其池实现。页面末尾列出了一些获取池资源https://github.com/vincit/tarn.js/信息的方法。
// returns the number of non-free resources
pool.numUsed()
// returns the number of free resources
pool.numFree()
// how many acquires are waiting for a resource to be released
pool.numPendingAcquires()
// how many asynchronous create calls are running
pool.numPendingCreates()
可以通过knex.client.pool
找到池实例。
const knex = require('knex')({ client: 'pg', connection: 'postgres://knex_test' });
knex.client.pool.numPendingCreates(); // returns 0