Java 如果查询需要很长时间且没有任何超时异常,则使用hibernate执行Postgres查询运行将被删除
我正在运行一个postgres查询,需要两个多小时。 此查询是在java程序中使用hibernate执行的。 大约1.5小时后,查询在pg_admin中的服务器状态中停止显示 由于查询已从数据库上的活动查询列表中消失,因此我希望查询成功或出现超时异常。但是,我一个也没有(没有例外),我的线程处于等待状态。 我知道查询还没有完成,因为它应该在表中进行一些插入,而我在表中找不到预期的行 我正在使用pgbouncer进行连接池,并且查询超时被禁用。 如果是休眠超时,我应该会有一个异常。 DB机器和客户端机器上的OS参数(运行java程序的机器)Java 如果查询需要很长时间且没有任何超时异常,则使用hibernate执行Postgres查询运行将被删除,java,linux,hibernate,postgresql,pgbouncer,Java,Linux,Hibernate,Postgresql,Pgbouncer,我正在运行一个postgres查询,需要两个多小时。 此查询是在java程序中使用hibernate执行的。 大约1.5小时后,查询在pg_admin中的服务器状态中停止显示 由于查询已从数据库上的活动查询列表中消失,因此我希望查询成功或出现超时异常。但是,我一个也没有(没有例外),我的线程处于等待状态。 我知道查询还没有完成,因为它应该在表中进行一些插入,而我在表中找不到预期的行 我正在使用pgbouncer进行连接池,并且查询超时被禁用。 如果是休眠超时,我应该会有一个异常。 DB机器和客户
- tcp_保持有效时间为7200(秒)
- tcp_keepalive_intvl=75
- tcp_keepalive_探测=9(探测数) 这两台机器都运行RHEL操作系统。 在这个问题上我不能指手画脚
SELECT pg_sleep(7200);
这将使您能够清楚地找出原因。我相信您已经看过以下参考资料:
SELECT pg_sleep(7200);
这应该可以让您清楚地找出问题的原因。我发现问题是由于TCP连接断开,而客户端仍挂起等待响应造成的 我在操作系统级别更改了以下参数:-
- /proc/sys/net/ipv4/tcp\u keepalive\u time=2700
这会导致每2700秒而不是7200秒进行一次保持活动状态检查。我发现问题是由于TCP连接断开,客户端仍挂起等待响应而导致的 我在操作系统级别更改了以下参数:-
- /proc/sys/net/ipv4/tcp\u keepalive\u time=2700
这会导致每2700秒而不是7200秒进行一次保持活动状态检查。附带问题:真的有必要进行如此大的查询吗?你就不能把它分开吗?通常不建议使用这种长时间运行的查询和事务。这是一种使用索引从表中删除的查询。使用Explain,我已确认正在使用索引。该表很大,需要进行大量删除。这就是为什么需要这么多时间。我关心的不是查询的质量,而是查询在没有任何响应的情况下从活动查询列表中消失。好吧,有时候解决眼前的问题并不是总体正确的解决方案。拥有更多更小的查询实际上可能更好(甚至更快)。难道没有一种方法可以对需要删除的内容的子集进行多次删除吗?附带问题:真的有必要进行如此大的查询吗?你就不能把它分开吗?通常不建议使用这种长时间运行的查询和事务。这是一种使用索引从表中删除的查询。使用Explain,我已确认正在使用索引。该表很大,需要进行大量删除。这就是为什么需要这么多时间。我关心的不是查询的质量,而是查询在没有任何响应的情况下从活动查询列表中消失。好吧,有时候解决眼前的问题并不是总体正确的解决方案。拥有更多更小的查询实际上可能更好(甚至更快)。是否有一种方法可以对需要删除的内容的子集发出多次删除?这有助于我识别问题并确定正在删除的是连接。谢谢。这有助于我识别问题,并指出是连接断开了。谢谢