Java 如果查询需要很长时间且没有任何超时异常,则使用hibernate执行Postgres查询运行将被删除

Java 如果查询需要很长时间且没有任何超时异常,则使用hibernate执行Postgres查询运行将被删除,java,linux,hibernate,postgresql,pgbouncer,Java,Linux,Hibernate,Postgresql,Pgbouncer,我正在运行一个postgres查询,需要两个多小时。 此查询是在java程序中使用hibernate执行的。 大约1.5小时后,查询在pg_admin中的服务器状态中停止显示 由于查询已从数据库上的活动查询列表中消失,因此我希望查询成功或出现超时异常。但是,我一个也没有(没有例外),我的线程处于等待状态。 我知道查询还没有完成,因为它应该在表中进行一些插入,而我在表中找不到预期的行 我正在使用pgbouncer进行连接池,并且查询超时被禁用。 如果是休眠超时,我应该会有一个异常。 DB机器和客户

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

由于查询已从数据库上的活动查询列表中消失,因此我希望查询成功或出现超时异常。但是,我一个也没有(没有例外),我的线程处于等待状态。 我知道查询还没有完成,因为它应该在表中进行一些插入,而我在表中找不到预期的行

我正在使用pgbouncer进行连接池,并且查询超时被禁用。 如果是休眠超时,我应该会有一个异常。 DB机器和客户端机器上的OS参数(运行java程序的机器)

  • tcp_保持有效时间为7200(秒)
  • tcp_keepalive_intvl=75
  • tcp_keepalive_探测=9(探测数) 这两台机器都运行RHEL操作系统。 在这个问题上我不能指手画脚

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

  • PostgreSQL超时
  • PgBouncer超时(您已经提到)
  • 休眠超时参数(如果有)
  • 完成后,(就像在新安装期间尝试权限问题一样),我建议您从不同的场景(如下所示)尝试以下SQL,并确定导致此超时的实际原因:

    SELECT pg_sleep(7200);
    
  • 登录到服务器(通过psql)并查看此SQL是否超时
  • 登录到PgBouncer(再次通过psql)并查看PgBouncer是否超时
  • 通过Hibernate(通过PgBouncer)执行此SQL,并查看是否存在超时

  • 这将使您能够清楚地找出原因。

    我相信您已经看过以下参考资料:

  • PostgreSQL超时
  • PgBouncer超时(您已经提到)
  • 休眠超时参数(如果有)
  • 完成后,(就像在新安装期间尝试权限问题一样),我建议您从不同的场景(如下所示)尝试以下SQL,并确定导致此超时的实际原因:

    SELECT pg_sleep(7200);
    
  • 登录到服务器(通过psql)并查看此SQL是否超时
  • 登录到PgBouncer(再次通过psql)并查看PgBouncer是否超时
  • 通过Hibernate(通过PgBouncer)执行此SQL,并查看是否存在超时

  • 这应该可以让您清楚地找出问题的原因。

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

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

    • /proc/sys/net/ipv4/tcp\u keepalive\u time=2700
    默认值为7200。
    这会导致每2700秒而不是7200秒进行一次保持活动状态检查。

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

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

    • /proc/sys/net/ipv4/tcp\u keepalive\u time=2700
    默认值为7200。
    这会导致每2700秒而不是7200秒进行一次保持活动状态检查。

    附带问题:真的有必要进行如此大的查询吗?你就不能把它分开吗?通常不建议使用这种长时间运行的查询和事务。这是一种使用索引从表中删除的查询。使用Explain,我已确认正在使用索引。该表很大,需要进行大量删除。这就是为什么需要这么多时间。我关心的不是查询的质量,而是查询在没有任何响应的情况下从活动查询列表中消失。好吧,有时候解决眼前的问题并不是总体正确的解决方案。拥有更多更小的查询实际上可能更好(甚至更快)。难道没有一种方法可以对需要删除的内容的子集进行多次删除吗?附带问题:真的有必要进行如此大的查询吗?你就不能把它分开吗?通常不建议使用这种长时间运行的查询和事务。这是一种使用索引从表中删除的查询。使用Explain,我已确认正在使用索引。该表很大,需要进行大量删除。这就是为什么需要这么多时间。我关心的不是查询的质量,而是查询在没有任何响应的情况下从活动查询列表中消失。好吧,有时候解决眼前的问题并不是总体正确的解决方案。拥有更多更小的查询实际上可能更好(甚至更快)。是否有一种方法可以对需要删除的内容的子集发出多次删除?这有助于我识别问题并确定正在删除的是连接。谢谢。这有助于我识别问题,并指出是连接断开了。谢谢