【问题标题】:Check for connections before dropping DB在删除数据库之前检查连接
【发布时间】:2014-05-29 07:51:41
【问题描述】:

我正在尝试删除数据库。在删除数据库之前,我只想检查是否有任何客户端连接到该特定数据库。

如果没有,我可以放弃它。

如果是,我想给用户一些有用的信息。

我知道这个查询,所以我可以看到与该数据库建立的连接数。

select count(*) from pg_stat_activity

如何在 Java 中做到这一点?

【问题讨论】:

    标签: java database postgresql


    【解决方案1】:

    我不会费心检查pg_stat_activity,因为即使你这样做了,在你启动DROP DATABASE 命令之前,有人可以在之后访问数据库。

    相反,我建议您使用与PostgresJDBCMyBatis 等)交互的任何方法发出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();
    

    【讨论】:

    • Ken,无论您共享的链接都在处理正在关闭的活动连接。我想知道,连接到该数据库的所有客户端是什么。可以回复一下吗?
    • 添加了对答案的回复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    相关资源
    最近更新 更多