如何在事务模式下将statement_timeout与pgBouncer一起使用



在事务模式下使用pgBouncer似乎是在任何给定时间减少活动连接数量的最佳方式,但它也引发了一个我不确定如何有效解决的问题。

假设您希望在DB级别有一个5分钟的一揽子语句timeout,只是为了防止任何意外的超长运行查询,但有一群工作人员运行的语句通常需要更长的时间。如果没有pgBouncer,您可以临时设置会话的statement_timeout,并将其设置回默认的afterwords,这样一切都可以正常工作。然而,在事务模式下使用pgBouncer时,如果不将有问题的操作包装在事务中并设置本地statement_timeout,这将无法可靠地工作。然而,这也是不可取的,因为这样您就可以任意长时间运行事务来实现所需的超时设置。

在事务模式下使用pgBouncer时,有没有任何方法可以将本地超时应用于语句,但不必使用事务?

您可以使用SET LOCAL仅更改当前事务的参数:

BEGIN;
SET LOCAL statement_timeout = '1h';
SELECT /* long running query */;
COMMIT;
-- now statement_timeout is reset to the original value

pgbouncer事务池模式主要是一种弥补设计或实现不佳的应用程序的方法。我不会说这是";最佳";什么都可以。

但有一群工作人员运行的语句通常比花费的时间长得多

也许会让这些工人通过不同的池?或者绕过pgbouncer直接访问数据库。

然而,这也不可取,因为这样你就有任意长时间运行的事务

每条语句都在事务内部运行。无论您是显式还是隐式地打开和关闭它们,它们仍然存在。

最新更新