1

我在 Web 应用程序上使用 pgbouncer,大多数线程以 BEGIN 开头,以 COMMIT 或 ROLLBACK 结尾,所以我们使用事务池,一切都很好。

但是,我们也有一些不使用事务的进程:相反,它们只是一个接一个地发出命令。

我相信,在事务池下,每个命令本身就是一个事务,就像您直接连接到服务器时一样,也许每个命令都从池中获得不同的连接。但是我被告知 pgbouncer 不会这样做,而是永远找不到最终的 COMMIT/ROLLBACK,因此连接不会返回到池中。

有人知道会发生什么吗?我在文档中找不到任何内容。

4

1 回答 1

2

https://pgbouncer.github.io/usage.html

https://pgbouncer.github.io/config.html#description

交易池

仅在事务期间将服务器连接分配给客户端。当 PgBouncer 注意到事务结束时,服务器连接将被放回池中。

在您的情况下,如果事务永远不会结束(提交、回滚),它将命中idle_transaction_timeout(默认禁用)并且idle in transaction连接将返回池,允许其他人连接。如果你有它的默认值,在某些时候所有的连接池都将被填满,所以新的连接池将被拒绝。从这一点开始,您的单个语句将不起作用-它们将等待永远不会出现的免费连接。

关于单个语句 - 它们不是“通过 pgbounce 转换为事务”,也不是“在事务池中,每个命令本身就是一个事务”。这是由AUTOCOMMIT每个会话控制的。

于 2017-03-16T10:17:49.230 回答