0

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

由于查询从数据库上的活动查询列表中消失了,我期待成功或超时异常。但是,我什么都没有。(没有例外)并且我的线程陷入等待状态。我知道查询尚未完成,因为它应该在表中进行一些插入,而我在表中找不到预期的行。

我正在使用 pgbouncer 进行连接池,并且禁用了 query_timeout。如果是休眠超时,我应该有一个例外。DB机器和Client机器上的OS参数(机器运行java程序)

  • tcp_keepalive_time 为 7200(秒)
  • tcp_keepalive_intvl = 75
  • tcp_keepalive_probes = 9(探测数) 两台机器都运行 RHEL 操作系统。我无法解决这个问题。
4

2 回答 2

2

我发现这个问题是由于 TCP 连接被丢弃并且客户端仍然挂起等待响应引起的。

我在操作系统级别更改了以下参数:-

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

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

于 2016-03-28T10:01:48.023 回答
1

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

  1. PostgreSQL 超时文档
  2. PgBouncer 超时(你已经提到过)。
  3. 休眠超时参数(如果有)。

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

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

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

于 2016-02-03T13:13:34.550 回答