打开PostgreSQL数据库连接的效率

Efficiency of opening PostgreSQL database connections

本文关键字:效率 数据库连接 PostgreSQL 打开      更新时间:2023-10-16

我们有一个PostgreSQL数据库来存储我们C++应用程序的数据,我们使用libpqxx连接到它。

目前,我们为要运行的每个事务打开一个新pqxx::connection。在部署中,我们预计每分钟最多执行大约四五十个事务,并且我们的应用程序将 24x7x365 运行。

根据PostgreSQL架构基础,

。[PostgreSQL服务器进程]为每个连接启动("分叉")一个新进程。

在我看来,我们为每个交易打开新pqxx::connection的方法确实效率低下,因为我们每分钟都会间接产生几十个新流程。这真的是我们应该担心的事情吗?

我在PostgreSQL wiki上看到PostgreSQL本身并不维护客户端连接进程池,因此看起来我们确实需要担心它。如果是这样,是否有一种"适当"的方法来无限期地保留pqxx::connection对象,以便每次我需要连接到数据库时都不会分叉新进程?请记住,我的应用程序需要全天运行,因此我的TCP连接在很长一段时间后断开是不可接受的。

你正在做的事情效率低下,但不是很严重。PostgreSQL的分叉成本在Unix平台上很低;后端的创建和销毁成本相当低。

设置、身份验证等确实需要时间,因此会增加事务延迟。

最好使用连接池,无论是在应用程序内还是在代理(如 pgbouncer)中。也就是说,对于"每分钟几十个连接",除非您遇到负载问题,否则我不会太担心。它很丑,但并没有那么糟糕。

不过,TCP连接不会在设定的时间段后"丢弃"。除非您位于某些资源有限的有状态 NAT 路由器或防火墙后面,否则它们可以无限期地保持空闲状态。如果你是,你只需要启用TCP保持连接。没有真正的理由不保持连接打开,只要你喜欢。

在任何情况下,您的应用程序都应该已经具有连接丢失的重试逻辑,因为后端可能会由于管理员操作、PostgreSQL 服务器崩溃恢复和重新启动、错误、导致 OOM 的服务器资源耗尽等而死亡。永远,永远不要触发并忘记交易。您的应用程序应该从一开始就记住重做整个 xact 所需的完整状态,直到它收到 xact 已从数据库提交的确认。如果任何步骤出现故障,它应该能够重新连接并重试。