gpt4 book ai didi

java - 注入(inject)类方法的读/写锁

转载 作者:行者123 更新时间:2023-11-30 10:33:48 24 4
gpt4 key购买 nike

我目前正在开发一个 RESTful 网络服务,该服务从两个不同的数据库读取和写入。我遇到的问题是处理调用我的服务然后在第一个完成写入之前收到第二个调用的情况。该服务读取数据库中的日期字段以确定是否需要插入或更新,然后在所选操作中写入该字段。如果第二次调用是在第一次调用完成之前进行的,日期字段将不会被写入,所以我最终得到两个插入而不是一个插入和一个更新。

我尝试使用 java 和 groovy 中可用的并发 API,但到目前为止我还无法让它工作。每次调用时,RESTful 服务都会查找模型类的新副本。模型类然后通过依赖注入(inject)获取 groovy 对象的新实例。因此,我不能在任何一个地方放置 Lock 的实例,因为 RESTful 服务的每次调用都将在模型和 groovy 的新实例上运行。

谁能建议一个更好的方法来做到这一点?任何帮助将不胜感激。

更新

这是服务的一些伪代码

  1. Lookup model data by id from table A of database 1.
  2. Lookup the most recent entry in table B of database 2 where the id matches a key stored in the model (dw_id).
  3. Compare the 'start date' column of the results to the current datetime.

If the 'day' of the start_date == the current day then:

4a. execute an UPDATE query on table B of database 2 using data obtained from the model.

Else:

5a. Execute an UPDATE query on table B of database 2, replacing the value of the end_date column with yesterday's date where id == dw_id.

5b. Execute an INSERT on table B of database 2, using data from the model, setting start_date to today's date and the end_date to a constant future date.

5c. Execute an UPDATE on table A of database 1, replacing the dw_id of the model with the auto-generated id of the entry created by the INSERT from 5b.

更新 2

我最终实现了与 jan-willem-gmelig-meyling 提出的解决方案类似的东西.我在这里找到了一个很好的实现示例:https://stackoverflow.com/a/27806218/32453我能够适应自己的需要。

最佳答案

在 Java 中,您可以通过在锁对象上进行同步来实现这一点。然而,这仅在您在开始数据库事务之前获得此锁时才有效。否则,这两个并行线程将同时启动一个数据库事务并存在于隔离的数据库版本中。所以你大致得到:

private final static Object lock = new Object();

public void myResource() {
synchronized (lock) {
// begin tx, do work, end tx.
// Other callee won't get here before first callee is finished
}
}

然而,这确实打破了所有服务器无状态约定。实际锁定事务中的数据库表要好得多。这可以防止另一个连接同时读取和写入同一个表。您可以调查您的数据库(或 ORM 库,如果使用的话)支持哪些锁定机制。 JTA 等技术可用于在服务器、服务或多个数据库之间共享数据库事务。

关于java - 注入(inject)类方法的读/写锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42032453/

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