打开PostgreSQL数据库连接的效率

时间:2016-04-28 15:13:48

标签: c++ postgresql libpq libpqxx

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

目前,我们为每个要运行的交易开设一个新的pqxx::connection。在部署中,我们希望每分钟最多执行大约四到五十次交易,我们的应用程序将全天候运行。

根据PostgreSQL architectural fundamentals

  

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

这听起来像我们为每个交易打开一个新pqxx::connection的方法效率非常低,因为我们每分钟间接产生几十个新进程。这是我们应该真正担心的事情吗?

我看到here on the PostgreSQL wiki PostgreSQL本身并没有维护一个客户端连接进程池,所以看起来我们确实需要担心它。如果是这样,是否有一种“正确”的方式可以无限期地保留pqxx::connection个对象,以便每次我需要连接到数据库时都不会分叉新进程?请记住,我的应用程序需要每天都在运行,所以我的TCP连接在很长一段时间后都会丢失是不可接受的。

1 个答案:

答案 0 :(得分:2)

你正在做的事情是效率低下的,但并非如此。在unix平台上,PostgreSQL的分叉成本很低;后端创建和销毁相当便宜。

设置,身份验证等确实需要时间,因此您将增加交易延迟。

最好在应用内或像pgbouncer这样的代理中使用连接池。也就是说,对于每分钟几十个连接"除非您遇到负载问题,否则我不会太担心。它很难看,但它并不那么糟糕。

TCP连接不仅仅是" drop"经过一段时间后。除非你在一些资源有限的状态NAT路由器或防火墙后面,否则它们可以无限期地保持空闲状态。如果您只是需要启用TCP keepalive。只要你愿意,没有任何理由不打开连接。

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