如果一个进程建立了多个 PostgreSQL 连接并在没有关闭它们的情况下终止,会发生什么?
What would happen if a process established multiple PostgreSQL connections and terminated without closing them?
我正在为购买的软件编写 DLL。
软件会对某些任务进行多线程计算。
我的工作是将相关结果输出到数据库中。
但是由于软件支持有限,数据的多线程输出有点难度
关键问题是没有关于DLL函数最后一次执行的信息。
因此,数据库连接不会被关闭。
请问,如果我保持连接打开并终止进程,可能会出现什么问题?
我的平台是 winserver 2008 和 PostgreSQL 10。
我不明白你提供的背景信息,但我可以回答这个问题:
如果 PostgreSQL 客户端进程在没有关闭数据库(和 TCP)连接的情况下终止,则为该连接提供服务的 PostgreSQL 服务器进程(“后端进程”)将不会立即意识到这一点。
当然,一旦服务器尝试与客户端通信,例如对于 return 一些结果,TCP 会注意到伙伴已经离开并会 return 一个错误。
但是,后端进程经常处于空闲状态,等待客户端发送下一个请求。在这种情况下,它永远不会注意到它的伙伴已经死了。这最终可能会导致 max_connections
因死连接而耗尽。
由于这是网络中的常见问题,TCP提供了“keepalive”功能:当连接空闲一段时间(默认2小时)时,操作系统会发送一个所谓的“keepalive packet” ”,等待对方的回应。以短时间间隔(默认为1秒)重复发送keepalive数据包数次(默认为5次),如果没有收到响应,则连接被操作系统关闭,后端进程收到错误消息并终止。
PostgreSQL 提供 parameters,您可以使用它在服务器端配置这些设置:tcp_keepalives_idle
、tcp_keepalives_count
和 tcp_keepalives_interval
。如果将 tcp_keepalives_idle
设置为较短的值,将更快地检测和删除死连接,但会增加一些网络流量。
我正在为购买的软件编写 DLL。
软件会对某些任务进行多线程计算。
我的工作是将相关结果输出到数据库中。
但是由于软件支持有限,数据的多线程输出有点难度
关键问题是没有关于DLL函数最后一次执行的信息。
因此,数据库连接不会被关闭。
请问,如果我保持连接打开并终止进程,可能会出现什么问题?
我的平台是 winserver 2008 和 PostgreSQL 10。
我不明白你提供的背景信息,但我可以回答这个问题:
如果 PostgreSQL 客户端进程在没有关闭数据库(和 TCP)连接的情况下终止,则为该连接提供服务的 PostgreSQL 服务器进程(“后端进程”)将不会立即意识到这一点。
当然,一旦服务器尝试与客户端通信,例如对于 return 一些结果,TCP 会注意到伙伴已经离开并会 return 一个错误。
但是,后端进程经常处于空闲状态,等待客户端发送下一个请求。在这种情况下,它永远不会注意到它的伙伴已经死了。这最终可能会导致 max_connections
因死连接而耗尽。
由于这是网络中的常见问题,TCP提供了“keepalive”功能:当连接空闲一段时间(默认2小时)时,操作系统会发送一个所谓的“keepalive packet” ”,等待对方的回应。以短时间间隔(默认为1秒)重复发送keepalive数据包数次(默认为5次),如果没有收到响应,则连接被操作系统关闭,后端进程收到错误消息并终止。
PostgreSQL 提供 parameters,您可以使用它在服务器端配置这些设置:tcp_keepalives_idle
、tcp_keepalives_count
和 tcp_keepalives_interval
。如果将 tcp_keepalives_idle
设置为较短的值,将更快地检测和删除死连接,但会增加一些网络流量。