我在网络应用上使用pgbouncer,大多数线程以BEGIN开头,以COMMIT或ROLLBACK结束,所以我们使用事务池,一切都很好。
但是,我们也有一些不使用交易的流程:相反,它们只是一个接一个地发出命令。
我相信,在事务池下,每个命令本身都是一个事务,就像你直接连接到服务器时那样,也许每个命令都从池中获得不同的连接。但是我被告知pgbouncer不会这样做,而是永远不会找到最终的COMMIT / ROLLBACK,因此连接不会返回池中。
有人知道会发生什么吗?我在文档中找不到任何内容。
答案 0 :(得分:2)
https://pgbouncer.github.io/usage.html
https://pgbouncer.github.io/config.html#description
交易池
仅在事务期间将服务器连接分配给客户端。 当PgBouncer注意到事务已结束时,服务器连接 将被放回游泳池。
如果事务永远不会结束(提交,回滚),它将点击idle_transaction_timeout
(默认禁用),idle in transaction
连接将返回池,允许其他人连接。如果您有默认值,则在某个时刻将填充所有连接池,因此将拒绝新的连接池。从这一点开始,您的单个语句将无效 - 它们将等待从未出现的免费连接。
关于单个语句 - 它们不是“通过pgbounce转换为事务”,而不是“在事务池中,每个命令本身都是一个事务”。每个会话由AUTOCOMMIT
控制。