【发布时间】:2014-05-29 07:51:41
【问题描述】:
我正在尝试删除数据库。在删除数据库之前,我只想检查是否有任何客户端连接到该特定数据库。
如果没有,我可以放弃它。
如果是,我想给用户一些有用的信息。
我知道这个查询,所以我可以看到与该数据库建立的连接数。
select count(*) from pg_stat_activity
如何在 Java 中做到这一点?
【问题讨论】:
标签: java database postgresql
我正在尝试删除数据库。在删除数据库之前,我只想检查是否有任何客户端连接到该特定数据库。
如果没有,我可以放弃它。
如果是,我想给用户一些有用的信息。
我知道这个查询,所以我可以看到与该数据库建立的连接数。
select count(*) from pg_stat_activity
如何在 Java 中做到这一点?
【问题讨论】:
标签: java database postgresql
我不会费心检查pg_stat_activity,因为即使你这样做了,在你启动DROP DATABASE 命令之前,有人可以在之后访问数据库。
相反,我建议您使用与Postgres(JDBC、MyBatis 等)交互的任何方法发出DROP DATABASE 命令,并用try/catch 块包围它.如果有用户连接到DROP DATABASE 命令将失败,因此您可以简单地执行该命令然后处理异常——也许休眠几秒钟然后重试,或类似的结果。
但是,如果您想强制任何活动用户离开数据库,pg_stat_activity 将发挥作用,您可以终止他们的后端连接,如下所述:How to drop a PostgreSQL database if there are active connections to it? 然后发出DROP DATABASE 命令。
根据 OP 的评论进行编辑:
就像我说的,因为如果有与数据库的连接,DROP 命令将失败,我不会先检查,但如果你真的想看看连接是什么(除了你的连接使用检查),您可以使用与上面链接中的内容类似的查询,只需调用pg_terminate_backend。
SELECT *
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'TARGET_DB'
AND pid <> pg_backend_pid();
【讨论】: