两三个星期前,我们突然开始获取SequelizeConnectionAcquireTimeoutError
日志,我不知道我还能做些什么。
因此,显然有一个连接池,当连接池满时,所有操作都会超时,因为它们无法获得一个连接池。因此,我将配置更改为:
dialectOptions: {
statement_timeout: 60000,
idle_in_transaction_session_timeout: 60000
},
pool: {
min: 0,
max: 10, // increased from 5
},
我将数据库服务器(AWS RDS)从1核升级到2核,并将postgres v9升级到v12
但它仍然在发生。而且有太多的事情要进行,无法快速找出哪个查询可能会被卡住,这一点由于它出现的随机性而变得更加困难。dialectOptions
怎么能不阻止这种情况呢?在我早上重新启动服务器之前,这个错误通常会被垃圾邮件发送几个小时
我们不运行任何复杂的查询,这是非常基本的REST风格的东西,这里和那里有一些连接。我已经研究了唯一复杂的事务驱动的代码块,我非常确定它完成了事务。在try/catch中,在我们的函数结束时,我们通过以下方式确保事务不会永远空闲:
if (transaction && !transaction.finished) {
await transaction.rollback()
}
这是正确的,还是不是我们认为的那样?
对于有同样问题的人: github的问题可能会有所帮助,并得到了很多评论https://github.com/sequelize/sequelize/issues/10858
Sequelize v6.3.5
更新: dialectOptions什么也没做,我试着像这样手动设置:
await Sequelize.query("SET statement_timeout = '1ms';")
await Sequelize.query("SET idle_in_transaction_session_timeout = '1ms';")
console.log('statement_timeout', await Sequelize.query('SHOW statement_timeout;'))
console.log('idle_in_transaction_session_timeout', await Sequelize.query('SHOW idle_in_transaction_session_timeout;'))
但不久之后,它又被重置为0。在我们的代码中,除了上面的代码行和dialectOptions之外,其他地方都没有使用这些设置。
如果将连接池设置为恰好1个连接,则会保留该设置,这意味着每个新连接都将取默认值
发布于 2021-03-23 19:28:54
为了支持statement_timeout
和idle_in_transaction_session_timeout
dialectOptions,还必须更新pg
模块。它们现在应用于所有连接。
我通过将这两个设置记录到其中一个api端点的控制台来验证这一点:
console.log('statement_timeout', await Sequelize.query('SHOW statement_timeout;'))
console.log('idle_in_transaction_session_timeout', await Sequelize.query('SHOW idle_in_transaction_session_timeout;'))
它以前会一直记录0(默认,禁用)。此外,将超时设置为1ms可以正确地取消查询。我猜这将有助于找出哪些查询或事务被阻塞,这要归功于抛出错误的sql
属性。
但是,本机驱动程序不支持它(参见https://github.com/brianc/node-postgres/pull/2323),因此Sequelize选项的native
现在被设置为false
。
https://stackoverflow.com/questions/66760244
复制相似问题