我在 Web 应用程序上使用 pgbouncer,大多数线程以 BEGIN 开头,以 COMMIT 或 ROLLBACK 结束,因此我们使用事务池,一切都很好。
但是,我们也有一些进程不使用事务:相反,它们只是一个接一个地发出命令。
我相信,在事务池下,每个命令本身都是一个事务,就像直接连接到服务器时的情况一样,也许每个命令都从池中获取不同的连接。但我被告知 pgbouncer 不会这样做,而是永远不会找到最终的 COMMIT/ROLLBACK,因此连接不会返回到池中。
有人知道会发生什么吗?我在文档中找不到任何内容。
最佳答案
https://pgbouncer.github.io/usage.html
https://pgbouncer.github.io/config.html#description
Transaction pooling
A server connection is assigned to client only during a transaction. When PgBouncer notices that transaction is over, the server connection will be put back into the pool.
在您的情况下,如果事务永远不会结束(提交、回滚),它将达到idle_transaction_timeout
(默认禁用),并且空闲事务
连接将返回池,允许其他人连接。如果你有它的默认值,在某些时候所有连接池都会被填满,所以新的连接池将被拒绝。从此时起,您的单个语句将不起作用 - 它们将等待永远不会出现的免费连接。
关于单个语句 - 它们不是“通过 pgbounce 转换为事务”,也不是“在事务池中,每个命令本身就是一个事务”。这是由每个 session 的 AUTOCOMMIT
控制的。
关于postgresql - 当启用事务池并发出单个语句时,pgbouncer 如何表现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23394272/