【问题标题】:Restrict postges access from java clients by using java program on a server通过在服务器上使用 java 程序来限制来自 java 客户端的 postges 访问
【发布时间】:2026-02-18 19:00:01
【问题描述】:

也许这个问题不是很清楚,但我没有找到更好的标题来描述我想尽快处理的问题。

我想限制从 java 桌面应用程序对 postgres 的访问。

背景:

假设您有 2 个应用程序正在运行,第一个应用程序必须根据数据库中的数据进行一些复杂的计算。为了确定数据库中数据的不变性,我想锁定数据库以进行插入、更新和删除操作。在客户端,我认为不可能令人满意地处理这种行为。所以我想在服务器端使用一个像代理一样工作的小 java-app。所以任务是交出CRUD(创建读更新删除)操作,直到它得到一个锁定的命令。锁定后,它会拒绝所有 CUD 操作,直到它从锁定客户端获得解锁命令或达到超时。

问题:

您如何看待这种方法?

是否可以在使用这种方法时锁定数据库?

您更喜欢 Java SE 还是 Java EE 作为服务器端 Java 应用程序?

提前致谢。

【问题讨论】:

    标签: java postgresql transactions


    【解决方案1】:

    为什么不在您的操作中使用transactions?数据库具有自身维护数据完整性的功能,而不是求助于诸如数据库总锁定之类的粗暴操作。

    您描述的这种锁定机制听起来会让用户感到痛苦。是用户发起了锁还是软件本身?如果是用户,当 Bob 锁定然后去吃午饭 2 小时,忘记先解锁数据库时,您可能会遇到一些问题......

    【讨论】:

      【解决方案2】:

      确实...有一些正确的方法可以解决这个问题。

      1. 只需锁定代码中的表即可。 Postgresql 具有用于锁定整个表的命令,您可以从客户端应用程序运行这些命令
      2. 选择一个事务隔离级别,在读取您的 txn 启动后提交的数据时不会出现问题(BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ)。

      其中,迄今为止最有效的方法是使用可重复读取作为您的隔离级别。 Postgres 非常有效地支持这一点,它会为您提供一致的数据视图,而无需对数据库进行如此繁重的锁定。

      【讨论】:

        【解决方案3】:

        那年我考虑过交易,但在这种情况下我无法使用它们。对不起,我没有准确地提到它。所以假设以下简单的情况: 计算结束了一个责任领域。在 calc 之后打开一个新的,并专门为它插入新的插入。但是,在计算过程中,不允许对(当前计算的)责任区域的数据进行插入、更新或删除。由于必须存档数据,因此严禁删除更多内容。

        因此,imo 使用事务不符合此要求。还是我错过了什么?

        ps:(题外话)@jsight:我目前读到 postgres 将“可重复读取”映射到“可序列化”,因此使用“可重复读取”会给您带来比您可能期望的更多限制。

        【讨论】: