我们可以为客户端设置2个超时
statement_timeout:查询中语句超时之前的毫秒数,默认情况下不超时query_timeout查询调用之前的毫秒数将超时,默认情况下不超时我是这样理解的:
statement_timeout将传递给数据库(请参阅超时),当语句花费的时间超过此时,数据库将中止查询并返回一个错误。query_timeout的信息。这是由驱动器(node-postgres)处理的。当达到此超时时,node-postgres将停止侦听响应,但数据库可能仍在执行查询。问题1我们应该设置查询超时略长于语句超时吗?
我想是因为:
交易记录
当我们使用事务处理时,情况如何?
当我们看文档中的示例时
try {
await client.query('BEGIN')
const queryText = 'INSERT INTO users(name) VALUES($1) RETURNING id'
const res = await client.query(queryText, ['brianc'])
const insertPhotoText = 'INSERT INTO photos(user_id, photo_url) VALUES ($1, $2)'
const insertPhotoValues = [res.rows[0].id, 's3.bucket.foo']
await client.query(insertPhotoText, insertPhotoValues)
await client.query('COMMIT')
} catch (e) {
await client.query('ROLLBACK')
throw e
}因此,在愉快路径中,我们调用query() 5次:在每个query()调用中应用查询/语句超时。
问题3所以BEGIN/COMMIT查询也有相同的超时a INSERT查询,对吗?
发布于 2019-12-18 13:48:22
经过一些使用pg承诺的测试后,我得出了这样的结论:query-timeout应该比statement-timeout稍长一些。
详细信息
仅查询超时
query-timeout =10秒statement-timeout =未定义在一个事务中,我们发送pgsleep(60) (睡眠60秒)
然后这种情况就会发生:
BEGIN语句发送到db。pgsleep(60)发送到db。ROLLBACK 去Query read timeout error语句-仅限超时
query-timeout =未定义statement-timeout =10秒在一个事务中,我们发送pgsleep(60) (睡眠60秒)
然后这种情况就会发生:
BEGIN语句发送到db。pgsleep(60)发送到db。57014:canceling statement due to statement timeout因此,我们应该更倾向于获得一个statement-timeout,并设置稍微长一点的query-timeout,以防数据库无法发回错误(我想,当出现网络问题时,情况可能是这样)。
https://stackoverflow.com/questions/59155572
复制相似问题