gpt4 book ai didi

java - 如何通过 JDBC 锁定 PostgreSQL 数据库?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:56:00 30 4
gpt4 key购买 nike

在我的 Java webapp 中,每个实例都在启动时检查数据库是否通过 JDBC 连接是最新的。如果数据库不是最新的,它会通过执行 SQL 脚本来执行更新例程。

我无法控制实例何时开始。因此,我需要确保只有一个实例同时执行数据库更新。理想情况下,我需要锁定整个数据库,但根据

http://www.postgresql.org/docs/8.4/static/explicit-locking.html

http://wiki.postgresql.org/wiki/Lock_database

PostgreSQL 不支持它(我还在使用 8.4 版)。

我还有哪些其他选择?

最佳答案

如果您控制所有实例的代码,那么您可以在数据库中创建一个表,每个启动的实例都会在该表中查找带有时间戳的记录。让我们称之为您的“锁定”记录。

如果一个进程发现锁记录不存在,那么它会插入记录并处理你需要的数据。

如果一个进程发现锁记录确实存在,那么你可以假设另一个进程已经创建了它并且什么也不做,忙着等待,或者什么都做。

通过这种设计,您可以有效地在数据库中创建一个“锁”来同步您的进程。您对其进行编码,以便所有进程都知道它们必须遵守锁定记录的逻辑。

一旦第一个拥有锁的进程完成处理,它应该清除锁记录,以便下一次重新启动正确运行。还需要考虑由于服务器错误,或者执行错误导致锁没有被清除的情况。通常,如果锁早于 n 分钟,您可以认为它是“陈旧的”,因此将其删除,然后重新创建(或只是更新它)。

在处理“锁定”记录时一定要使用 Serializable数据库连接的隔离级别,以保证原子性。

Java 代码的服务 层可以在调用数据访问 层之前强制实现锁定策略。您是否使用 Hibernate 并不重要,因为它只是应用程序逻辑。

关于java - 如何通过 JDBC 锁定 PostgreSQL 数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12300832/

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