gpt4 book ai didi

java - 如何使用 JDBC 取消 PostgreSQL 中长时间运行的查询?

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:10:36 25 4
gpt4 key购买 nike

在我的项目中,我有一些遗留插件。这些插件用于 PostgreSQL 的只读查询。大多数插件运行良好,但其他部分确实很慢。这是从 C3P0 获取连接时挂断的原因。看起来池上连接超时的更改没有效果。

我如何设置超时以有效取消这些查询?我认为服务器端超时是个不错的解决方案,但我不想在配置中为所有服务器设置超时。此外,我不想断开此连接,只需要取消当前查询。

你能分享一下你对解决这个问题的想法吗?

最佳答案

如果动态设置配置参数statement_timeout,这个参数只影响当前 session :执行超过给定时间的查询将被取消,而不会断开连接。

test=# set statement_timeout to 1000;  -- 1s
SET
test=# select pg_sleep(5); -- 5s
ERROR: canceling statement due to statement timeout
test=# set statement_timeout to 0; -- turn off
SET

更新 - 控制 Postgres 进程的方法的简要概述。

您可以列出服务器的所有正在运行的进程:

test=# select pid, query_start, state, query from pg_stat_activity;
pid | query_start | state | query
------+----------------------------+--------+--------------------------------------------------------------
4004 | 2015-07-12 20:50:01.033+02 | active | select pid, query_start, state, query from pg_stat_activity;

例如,此查询列出了执行时间超过 5 分钟的查询:

select *
from pg_stat_activity
where state = 'active'
and now() - query_start > '5m';

您可以手动取消长时间运行的查询:

select pg_cancel_backend(pid);

或终止进程:

select pg_terminate_backend(pid);

您可以运行一个程序,它会自动取消长时间运行的查询。它可能是一个后台进程(daemon),或者可能用cron 执行。

此查询自动取消执行时间超过 5 分钟的查询:

select pg_cancel_backend(pid)
from pg_stat_activity
where state = 'active'
and now() - query_start > '5m';

当然,必须非常谨慎并在充分意识到后果的情况下实现此类自动化解决方案。

文档中的更多内容:pg_stat_activity , pg_cancel_backend() .

关于java - 如何使用 JDBC 取消 PostgreSQL 中长时间运行的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31359000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com