pgBouncer池化类型的区别

The difference of pgBouncer pooling types

我正在阅读有关 pgBouncer 的内容,但无法完全理解不同类型的池化工作原理:

Session pooling
Most polite method. When a client connects, a server connection will be assigned to it for the whole duration the client stays connected. When the client disconnects, the server connection will be put back into the pool. This is the default method.

Transaction pooling
A server connection is assigned to a client only during a transaction. When pgbouncer notices that transaction is over, the server connection will be put back into the pool.

Statement pooling
Most aggressive method. The server connection will be put back into the pool immediately after a query completes. Multi-statement transactions are disallowed in this mode as they would break.
  1. Transaction pooling描述中的...pgbouncer notices that transaction is over...是执行了COMMIT还是ROLLBACK是正确的,还是另有所指?

让我们看看下面的查询:

BEGIN                     -- 1
SELECT * FROM test_table  -- 2
SELECT * FROM test_table  -- 3
COMMIT                    -- 4
SELECT * FROM test_table  -- 5

如果我使用 session pooling,所有 5 行都将被执行,客户端将在它之后保持连接。

  1. 如果使用transaction pooling,连接将在第4行后停止是否正确?
  2. Statement pooling描述中的querystatement有什么区别?

更新: 如果我使用事务池发送以下查询:

SELECT * FROM test_table
SELECT * FROM test_table 
... -- repeat many times
SELECT * FROM test_table --last 

是否会在“last”之后将连接放回池中,或者语句序列可以在不使用 BEGIN-COMMIT 的情况下划分为事务?

使用事务池,连接将在第 4 步后返回池中,但不会“停止”。第 5 步可以通过不同的数据库连接执行。

在语句池的描述中,“查询”是指“语句”。

在你的最后一个例子中,事务和语句池都可以 运行 不同连接上的每个语句(记住 PostgreSQL 使用自动提交,所以默认情况下每个语句 运行 在它自己的事务中) .