如果进程建立多个PostgreSQL连接并在不关闭它们的情况下终止会发生什么?

问题描述 投票:1回答:1

我正在为购买的软件编写DLL。

该软件将对某些任务执行多线程计算。

我的工作是将相对结果输出到数据库中。

但是,由于软件的支持有限,因此很难对数据进行多线程输出。

关键问题是最后一次执行DLL函数没有信息。

因此,不会关闭数据库连接。

那么我可以问一下,如果我打开连接并终止该过程,那么潜在的问题是什么?

我的平台是winserver 2008,PostgreSQL 10。

windows postgresql database-connection libpq
1个回答
2
投票

我不明白你提供的背景信息,但我可以回答这个问题:

如果PostgreSQL客户端进程在没有关闭数据库(和TCP)连接的情况下死亡,那么服务此连接的PostgreSQL服务器进程(“后端进程”)将不会立即意识到这一点。

当然,只要服务器尝试与客户端通信,例如,要返回一些结果,TCP会注意到伙伴已经离开并将返回错误。

但是,后端进程通常处于空闲状态,等待客户端发送下一个请求。在这种情况下,它永远不会注意到它的伙伴已经死亡。这最终可能导致max_connections因死亡连接而疲惫不堪。

由于这是网络中的常见问题,TCP提供“keepalive”功能:当连接空闲一段时间(默认为2小时)时,操作系统将发送所谓的“keepalive数据包”并等待来自另一方的回应。发送keepalive数据包在短时间间隔内默认重复几次(默认为1次),如果没有收到响应,则操作系统关闭连接,后端进程收到错误消息并终止。

PostgreSQL提供parameters,您可以在服务器端配置这些设置:tcp_keepalives_idletcp_keepalives_counttcp_keepalives_interval。如果将tcp_keepalives_idle设置为较短的值,则会以较少的网络流量为代价检测并删除死连接。

© www.soinside.com 2019 - 2024. All rights reserved.