PG 9.3.4
JDBC: postgresql-9.3-1101.jdbc3.jar
jdbc客户端有两个线程,
A线程负责执行sql,
B线程负责清理超时的JDBC连接Connection
现在由于A线程执行了一个非常耗时的查询, 执行时间很长。
B线程检测超时后,执行Connection.close()接口, 关闭该连接。
但是我在数据库后台发现, 与jdbc客户端的socket链接已经关闭(为close_wait状态),但是那个被关闭的查询还在执行。
请问有什么方法可以将查询彻底关闭? 在jdbc客户端能否彻底关闭这个查询?
HI, 可以执行select pg_terminate_backend(pid)来关闭这个连接。
或者执行pg_cancel_backend(pid)来退出PID的当前查询。
找到方法了, 可以直接在客户端管理这类异常/超时的查询。
1、直接从客户端获取当前连接的进程id
客户端新建jdbc连接conn时,通过执行以下sql获取该链接的后台进程pid:
select procpid, start, S.client_host, S.client_port, now() - start as lap, current_query
from
(
select backendid, pg_stat_get_backend_pid(S.backendid) as procpid,
pg_stat_get_backend_activity_start(S.backendid) as start,
pg_stat_get_backend_client_addr(S.backendid) as client_host,
pg_stat_get_backend_client_port(S.backendid) as client_port,
pg_stat_get_backend_activity(S.backendid) as current_query
from
(select pg_stat_get_backend_idset() as backendid) as S
) as S,
( select inet_client_addr() as client_host, inet_client_port() as client_port ) as client
where client.client_host = S.client_host and client.client_port = S.client_port;
2、客户端连接池管理线程记录conn<->pid的对应关系
3、当客户端发现该连接conn异常/超时后,结合digoal回答的关闭查询pid的方法,将该pid上的查询关闭。
pg_cancel_backend(pid)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。