【问题标题】:How to use statement_timeout with pgBouncer in transaction mode如何在事务模式下将 statement_timeout 与 pgBouncer 一起使用
【发布时间】:2021-02-27 18:52:08
【问题描述】:

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

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

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

【问题讨论】:

    标签: postgresql pgbouncer


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      pgbouncer 事务池模式主要是一种掩盖设计或实现不佳的应用程序的方法。我不会说它对任何东西都是“最佳的”。

      但是有一群工作人员运行的语句通常需要比这更长的时间

      也许让这些工人跑过不同的水池?或者绕过pgbouncer直接打数据库。

      但是,这也是不可取的,因为那样你就有了任意长时间运行的事务

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

      【讨论】:

        猜你喜欢
        • 2021-02-04
        • 2014-05-25
        • 1970-01-01
        • 2011-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-07
        • 2012-03-10
        相关资源
        最近更新 更多