PGBouncer 的参数 server_reset_query 的目的是什么?

fra*_*ncs 6 postgresql

最近开始学习pgbouncer,但是对参数有一些不明白的地方server_reset_query

问题一:主要目的是server_reset_query什么?

问题2:pgbouncer的pool_mode有3种模式:session模式、transaction模式和statement模式。当 pool_mode 为 session 时,我们通常将
server_reset_query的值设置为 'DISCARD ALL'。当 pool_mode 为事务时,我们通常将 server_reset_query 的值设置为 ''?

我不知道这方面的细节,所以有人可以解释一下吗?

Pet*_*aut 9

由于 pgbouncer 是一个连接池,它会为潜在的许多客户端连接重用一个到数据库服务器的实际连接。它必须确保在下一个客户端获得连接时重置第一个客户端创建的任何会话状态。否则,第一个客户端可能会执行类似的操作SET statement_timeout = '5min',这将适用于碰巧分配了该连接的所有后续客户端。为避免这种情况,pgbouncer 在将服务器连接分发给新客户端之前发出“服务器重置查询”。正如文档所说

Postgres 8.2 及以下版本的一个不错的选择是:

server_reset_query = RESET ALL; SET SESSION AUTHORIZATION DEFAULT;

对于 8.3 及更高版本,它足以做:

server_reset_query = DISCARD ALL;

这个设置存在的主要原因DISCARD ALL是为了这个目的而发明的语句在 PostgreSQL 8.3 之前不可用。

该设置独立于池模式应用。请注意,客户端可以SET在任何池模式下发出语句或类似的内容。

文档还说

当使用事务池时,server_reset_query应该为空,因为客户端不应该使用任何会话功能。

我认为这是一种基于信仰的方法。如果你认为你的代码很干净并且你需要额外的性能,那就去吧。不过,我已经被这个咬了。例如,如果你使用check_postgres来监控你的 pgbouncer 连接,它会SET statement_timeout像我上面展示的那样发出类似的问题,并弄乱你的连接。