连接池#

连接池是可重复使用的数据库连接的缓存。它允许使用较少的数据库连接来处理多个HTTP请求。每一次对 API resource 从池中借用连接以启动 transaction

最大限度地减少连接对性能至关重要。每个PostgreSQL连接都会创建一个进程,拥有太多连接可能会耗尽可用资源。

连接字符串#

要连接到数据库,池需要连接字符串。您可以使用以下命令进行配置 Db-uri

动态连接池#

为节省系统资源,PostgREST使用动态连接池。这使池中的连接数量可以根据请求流量的不同而增加和减少。

  • 如果正在使用所有连接,则会添加一个新连接。池可以不断增长,直到它达到 数据库池 尺码。请注意,将此值设置为高于 max_connections 数据库中的设置。

  • 如果某个连接在一段时间内未使用 (数据库池最大空闲时间 ),它将被发布。

连接生存期#

长时间的PostgreSQL连接可能会消耗大量内存(请参见 here 以了解更多详细信息)。在繁忙的系统下, 数据库池最大空闲时间 将无法访问,并且连接池可能会充满长期连接。

为了避免此问题并节省资源,连接的最长生存期 (数据库池最长生存期 )被强制执行。达到最大生存期后,将释放池中的连接并创建新的连接。这不会影响正在运行的请求,只会释放未使用的连接。

获取超时#

如果池中的所有可用连接都很忙,则HTTP请求将一直等待到超时 (DB-POOL-获取-超时 )。

如果请求到达超时,它将被中止,并返回以下响应:

HTTP/1.1 504 Gateway Timeout

{"code":"PGRST003",
 "details":null,
 "hint":null,
 "message":"Timed out acquiring connection from connection pool."}

重要

收到此错误消息是性能问题的指示器。要解决此问题,您可以:

  • 减少您的查询执行时间。

    • 检查请求 执行计划 要调优查询,这通常意味着添加索引。

  • 减少请求量。

    • 减少写入请求。做 大容量插入 (或 向上插入 )而不是一个接一个地插入行。

    • 减少读取请求。使用 资源嵌入 。使用自定义数据库视图或函数将不相关的数据合并到单个请求中。

    • 使用 作为RPC的功能 用于将读和写逻辑组合到单个请求中。

  • 增加 数据库池 尺码。

    • 不是灵丹妙药,因为连接不可能无限增长。在此之前,请尝试前面的建议。

自动恢复#

如果发生连接中断,服务器将重新尝试重新连接到数据库。

  • 它将使用指数退避永远重试,两次重试之间的最大退避时间为32秒。每一次尝试都是 logged

  • 只有当服务器认为该错误是致命的时,它才会停止重试。这可能是密码身份验证失败或内部错误。

  • 如果出现以下情况,则在连接断开后立即重试 数据库通道已启用 设置为True(默认设置)。否则,一旦请求到达,它们就会发生。

  • 为确保状态有效,服务器会重新加载 架构缓存配置 在康复的时候。

  • 为了通知客户端下一次重试,服务器发送一个 503 Service Unavailable 状态与 Retry-After: x 标题。哪里 x 是为下一次重试设置的秒数。

  • 可通过设置禁用自动恢复 数据库池-自动-恢复false

使用外部连接池#

可以使用外部连接池,如PgBouner。会话池是兼容的,而事务池需要 DB-准备好的语句 设置为 false 。语句池与PostgREST不兼容。

还设置了 数据库通道已启用false 自那以后 LISTEN 与事务池不兼容。但如果保留启用状态,则不会给出任何错误。

备注

不建议使用外部连接池。 Our benchmarks 表明它提供的性能远低于PostgREST内置池。