连接池#
连接池是可重复使用的数据库连接的缓存。它允许使用较少的数据库连接来处理多个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."}
自动恢复#
如果发生连接中断,服务器将重新尝试重新连接到数据库。
它将使用指数退避永远重试,两次重试之间的最大退避时间为32秒。每一次尝试都是 logged 。
只有当服务器认为该错误是致命的时,它才会停止重试。这可能是密码身份验证失败或内部错误。
如果出现以下情况,则在连接断开后立即重试 数据库通道已启用 设置为True(默认设置)。否则,一旦请求到达,它们就会发生。
为了通知客户端下一次重试,服务器发送一个
503 Service Unavailable
状态与Retry-After: x
标题。哪里x
是为下一次重试设置的秒数。可通过设置禁用自动恢复 数据库池-自动-恢复 至
false
。
使用外部连接池#
可以使用外部连接池,如PgBouner。会话池是兼容的,而事务池需要 DB-准备好的语句 设置为 false
。语句池与PostgREST不兼容。
还设置了 数据库通道已启用 至 false
自那以后 LISTEN
与事务池不兼容。但如果保留启用状态,则不会给出任何错误。
备注
不建议使用外部连接池。 Our benchmarks 表明它提供的性能远低于PostgREST内置池。