如果查询花费很长时间而没有任何超时异常,则使用休眠执行的 Postgres 查询 运行 将被删除

Postgres query run executed using hibernate getting dropped if the query takes a long time without any timeout exception

我运行正在执行一个需要两个多小时的 postgres 查询。 此查询是在 java 程序中使用休眠执行的。 大约 1.5 小时后,查询停止显示在 pg_admin 的服务器状态中。

因为查询从数据库的活动查询列表中消失了,我期待成功或超时异常。但是,我得到 none.(无一例外)并且我的线程卡在等待状态。 我知道查询尚未完成,因为它应该在 table 中执行一些插入操作,但我在 table.

中找不到预期的行

我正在使用 pgbouncer 作为连接池,query_timeout 被禁用。 如果它是休眠超时,我应该得到一个例外。 OS DB机器和Client机器上的参数(机器运行ning java程序)

我相信您已经看过以下资源:

  1. PostgreSQL 超时 Docs
  2. PgBouncer 超时(您已经提到)。
  3. Hibernate 超时参数,如果有的话。

一旦完成,(就像在新安装期间对权限问题进行分类一样)我建议您尝试以下 SQL,从不同的场景(如下所示)并确定真正导致此超时的原因:

SELECT pg_sleep(7200);
  1. 登录服务器(通过psql),看看这个SQL是否超时。
  2. 登录到 PgBouncer(同样通过 psql)并查看 PgBouncer 是否超时。
  3. 通过Hibernate(通过PgBouncer)执行此SQL,并查看是否超时。

这应该可以让您清楚地找出原因。

我发现问题是由于 TCP 连接断开而客户端仍然挂起等待响应。

我在 OS 级别更改了以下参数:-

  • /proc/sys/net/ipv4/tcp_keepalive_time = 2700

默认值为 7200。 这会导致每 2700 秒而不是 7200 秒进行一次保持活动检查。