打开PostgreSQL数据库连接的效率
Efficiency of opening PostgreSQL database connections
我们有一个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 已从数据库提交的确认。如果任何步骤出现故障,它应该能够重新连接并重试。
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 如何在多个线程中创建 QSql数据库连接时防止名称冲突
- 数据库连接并将数据从C ++程序保存到MySQL
- 在 C++ 中获取数据库连接
- Firebase C++ Windows 上的实时数据库连接丢失
- 我不能使用 mysql 数据库连接同时使用插入和选择.C++
- C++ Qt SQL lite 数据库连接问题
- C++ 程序中的数据库连接检查
- 打开与 Qt/C++ 的数据库连接
- 如何修复数据库连接的C 程序运行时间错误(0xc0000005)
- 使用libpq组织PostgreSQL数据库连接参数
- Qt 中的数据库连接池
- Qt-同时处理多个数据库连接
- 使用QT C 为Sevaral表单创建常见的数据库连接
- 将Raspberry Pi 2与外部远程数据库连接
- 是否允许在同一 Sqlite 数据库连接中启动多个事务
- IIS-部署ASP.NET网站和数据库连接
- 没有数据库连接的字符串转义
- Singletone中的数据库连接
- 打开PostgreSQL数据库连接的效率