我们可以为Client设置2个超时时间:
-
我这样理解:
-
我认为应该,因为这样做有以下好处:
- 当一个查询真正花费太长时间时,数据库将终止查询并返回错误。 - 如果应用程序在查询超时时间内未收到来自服务器的响应,则应用程序会抛出超时错误。 问题2:这可能是什么原因?例如TCP/IP连接有问题吗?
这可能是由于网络问题、服务器负载过高或其他一些原因导致的。
例如文档中的示例:
-
statement_timeout
:查询中语句超时的毫秒数,默认没有超时时间。
- query_timeout
:查询调用超时的毫秒数,默认没有超时时间。我这样理解:
-
statement_timeout
会传递给数据库(参见postgres-docs:statement_timeout),当一条语句执行的时间超过了这个时间,数据库将终止查询并返回错误。
- 数据库不知道query_timeout
的任何信息。这由驱动程序(node-postgres
)处理。当达到此超时时间时,node-postgres
将停止等待响应,但是数据库可能仍在执行查询。
问题1:我们应该将查询超时时间设置得比语句超时时间稍长吗?我认为应该,因为这样做有以下好处:
- 当一个查询真正花费太长时间时,数据库将终止查询并返回错误。 - 如果应用程序在查询超时时间内未收到来自服务器的响应,则应用程序会抛出超时错误。 问题2:这可能是什么原因?例如TCP/IP连接有问题吗?
这可能是由于网络问题、服务器负载过高或其他一些原因导致的。
事务
我们在什么情况下使用事务?例如文档中的示例:
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
查询的超时时间和INSERT
查询的超时时间一样吗?