在 pgbouncer 池的连接中使用临时 PostgreSQL 表

问题描述 投票:0回答:1

我想每次在客户端向我的 Rails 7.1 服务器发出 http 请求时或在每个后台 sidekiq 作业中创建临时 PostgreSQL 表。

我通过 pgbouncer (pool_mode = transaction) 与我的 postgresql 15 数据库有活动记录连接。

我知道连接关闭时临时表正在删除。

如果我首先使用

MyModel.connection.execute 'create temp table tmp_test ...'
创建临时表,然后做一些事情(也许 1 分钟后?)并使用
MyModel.connection.execute 'insert into tmp_test values ...'
执行第二次,这是安全的。我的临时表还会存在吗?

当我使用第二个执行语句时,如果我采取(另一个?)连接,临时表会下降,我有点困惑

ruby-on-rails postgresql connection-pooling temp-tables pgbouncer
1个回答
0
投票
  1. 只要您保持发出这些后续查询的连接,您计划做的事情就是安全的。临时对象是可见的,并且只能由创建它们的会话/连接访问,并且存在于它们的私有中

    pg_temp_NNN 
    架构。如果您获得一个连接,
    create temp table
    ,释放该连接并请求另一个连接,则不能保证您会获得相同的连接,其中包含该临时对象。

    如果我在使用第二个执行语句时采取(另一个?)连接,临时表就会丢失

    根据池设置,它可能会或可能不会被实际删除,但您可能看不到它,因为如果您释放了初始连接,然后获得了另一个连接,则临时值仍位于旧连接中,而新连接则不会看到它,也不能以任何方式从中访问它。同时,其他一些工作人员可能会意外地从池中获取连接,该临时对象仍然存在。

  2. temp
    表可以配置为
    on commit drop
    ,如果您处于
    pool_mode=transaction
    并且连接未回收(释放后关闭并重新打开)和/或使用
    discard清理,这可以简化事情
    。这样,即使连接未关闭,您的
    temp
    对象也会在您
    commit
    后立即被清理。

© www.soinside.com 2019 - 2024. All rights reserved.