如果查询花费很长时间而没有任何超时异常,则使用休眠执行的 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程序)
- tcp_keepalive_time 是 7200(秒)
- tcp_keepalive_intvl = 75
- tcp_keepalive_probes = 9(探测数)
两台机器都是运行 RHEL操作系统。
我无法确定这个问题。
我相信您已经看过以下资源:
- PostgreSQL 超时 Docs
- PgBouncer 超时(您已经提到)。
- Hibernate 超时参数,如果有的话。
一旦完成,(就像在新安装期间对权限问题进行分类一样)我建议您尝试以下 SQL,从不同的场景(如下所示)并确定真正导致此超时的原因:
SELECT pg_sleep(7200);
- 登录服务器(通过psql),看看这个SQL是否超时。
- 登录到 PgBouncer(同样通过 psql)并查看 PgBouncer 是否超时。
- 通过Hibernate(通过PgBouncer)执行此SQL,并查看是否超时。
这应该可以让您清楚地找出原因。
我发现问题是由于 TCP 连接断开而客户端仍然挂起等待响应。
我在 OS 级别更改了以下参数:-
- /proc/sys/net/ipv4/tcp_keepalive_time = 2700
默认值为 7200。
这会导致每 2700 秒而不是 7200 秒进行一次保持活动检查。
我运行正在执行一个需要两个多小时的 postgres 查询。 此查询是在 java 程序中使用休眠执行的。 大约 1.5 小时后,查询停止显示在 pg_admin 的服务器状态中。
因为查询从数据库的活动查询列表中消失了,我期待成功或超时异常。但是,我得到 none.(无一例外)并且我的线程卡在等待状态。 我知道查询尚未完成,因为它应该在 table 中执行一些插入操作,但我在 table.
中找不到预期的行我正在使用 pgbouncer 作为连接池,query_timeout 被禁用。 如果它是休眠超时,我应该得到一个例外。 OS DB机器和Client机器上的参数(机器运行ning java程序)
- tcp_keepalive_time 是 7200(秒)
- tcp_keepalive_intvl = 75
- tcp_keepalive_probes = 9(探测数) 两台机器都是运行 RHEL操作系统。 我无法确定这个问题。
我相信您已经看过以下资源:
- PostgreSQL 超时 Docs
- PgBouncer 超时(您已经提到)。
- Hibernate 超时参数,如果有的话。
一旦完成,(就像在新安装期间对权限问题进行分类一样)我建议您尝试以下 SQL,从不同的场景(如下所示)并确定真正导致此超时的原因:
SELECT pg_sleep(7200);
- 登录服务器(通过psql),看看这个SQL是否超时。
- 登录到 PgBouncer(同样通过 psql)并查看 PgBouncer 是否超时。
- 通过Hibernate(通过PgBouncer)执行此SQL,并查看是否超时。
这应该可以让您清楚地找出原因。
我发现问题是由于 TCP 连接断开而客户端仍然挂起等待响应。
我在 OS 级别更改了以下参数:-
- /proc/sys/net/ipv4/tcp_keepalive_time = 2700
默认值为 7200。 这会导致每 2700 秒而不是 7200 秒进行一次保持活动检查。