我不了解Postgres的一些机制,这让我很沮丧。我通常使用DBeaver作为SQL客户端来查询外部pg库。如果运行create。。或插入。。查询,然后由于某种原因连接中断或无效,pid仍在运行并完成事务。
但对于我们所写的一些更复杂的PL/pgSQL函数(包括临时表、循环、插入等(,断开连接总是会导致进程终止(它在进行下一个sql操作之前从会话列表中消失,例如在日志表中插入一行(。无论是DBeaver编辑器还是psql命令。
我知道断开连接可能是一个关键问题,应该消除这个问题,也许我不应该期望这个过程成功地继续下去,但我知道:(或者只是想知道为什么会发生这种情况,有可能预防吗?
如果网络连接失败,数据库服务器可以通过两种方式检测:
-
如果它试图向客户端发送数据,它会很快发现连接已中断
-
如果它试图从客户端接收数据,它只会在内核的TCP保持活动机制确定连接已关闭时才注意到
当你说有时函数的执行会立即终止时,我会说这是因为函数向客户端返回了数据。
在查询继续运行的情况下,它还没有试图返回任何数据。
前者无法治愈,但在PostgreSQL v14中,可以通过设置client_connection_check_interval
来防止后者。此外,您必须设置PostgreSQL保活参数,以便快速知道死连接。
查看我的文章了解更多信息。