有效地将结果流存储在多个表中,并且每个项目均具有乐观锁定 - java

鉴于结果流中包含很多项目,我想存储它们并处理潜在的并发冲突:

public void onTriggerEvent(/* params */) {
  Stream<Result> results = customThreadPool.submit(/*...complex parallel computation on multiple servers...*/).get();
  List<Result> conflicts = store(results);
  resolveConflictsInNewTransaction(conflicts);
}

我对如何有效地实现store(...)感到很不满意。 Result由两个不可变和分离的对象组成,这些对象描述需要在其各自的DB表中更新的数据。

@Value
public static class Result {
    A a; // describes update for row in table a
    B b; // describes update for row in table b
}

AB各自引用两个用户,其中(u1, u2)是相应数据库表上的键。

@Value
public static class A {
    long u1;
    long u2;
   // ... computed data fields ...
}
// B accordingly

流计算本身可以同时触发(并行调用多个onTriggerEvent),这通常很好,但有时可能会导致某些结果发生冲突(约0.1%发生冲突,例如,某个流具有(53,21)的结果,而另一个具有同时调用也会更新(53,21))。 A和/或B的冲突由它们的updatedAt字段指示,该字段与操作开始时相比会有所不同。当然,在这里,我们不想扔掉所有结果,而只想再试一次,而只想解决冲突中的行。

因此,我想知道什么是(1)存储所有不冲突的Result.aResult.b的好方法,以及(2)获得冲突且需要特殊处理的ListResult的好方法。

public List<Result> store(Stream<Result> results) {
  // store all a
  // store all b (ideally without using results * 2 RAM)
  // do update other stuff if a and b are not in conflict and do it in the same ACID transaction as the update of the related a and b.
  // return those in Conflict
}

如何在不解压每个结果,将其以自身事务发送给db等的情况下实现它?理想情况下,我需要一次将所有内容发送到数据库,并获取尚未存储的冲突列表(其他冲突应保留)。我也欢迎采用其他方法。

如果相关,我们将使用JPA / Hibernate。

参考方案

最简单的方法是将持久性简化为FIFO队列(存在很多技术,但通常会以“每笔交易唯一输入”的方式成为一种,这不是理想的方法)。

因此,对于第二种选择,我将并发冲突定义的逻辑从数据库持久性操作中移出到单独的服务中。

您可以实现类似于UserId到Reentrant锁的内存映射(与同步块相比,这些操作确实非常快)。

在第一个持久调用中,锁被锁定;成功持久后,将释放锁定。在此期间(在单独的线程中),您可以检查锁的状态,然后通过该状态过滤掉,或者等待直到锁被释放。注意等待状态:您有流,因此处理一个流的整个线程将进入等待状态。

就个人而言,我会坚持第一个“每个事务一个条目”,中间带有一些(持久)消息队列,并具有用于锁定检查的单独服务。首先,这将使我们能够轻松配置写入操作的并发性。第二,在写入器中轻松使用等待状态,因为只有一个条目将被锁定。

Java 8`Stream`可以并行运行,甚至不需要您吗? - java

如我所见,在使用Java 8 Stream时,显而易见的代码无论是“对象”流还是原始流(即IntStream和朋友)都将仅使用:someStreamableResource.stream().whatever() 但是,然后,相当多的“流媒体资源”也有了.parallelStream()。读取javadoc时不清楚的是.stream()流是否始终是顺序的,以…

Spring MVC中的输入验证 - java

我知道Commons Validator框架是Struts项目在服务器端和客户端验证输入值的事实上的标准。Spring MVC项目是否也是如此?我得到的印象可能不是,大多数Struts书籍和论坛都谈论Commons Validator框架,但是只有少数Spring书籍和论坛可以。在Spring MVC项目中验证输入的最佳实践是什么?干杯! 参考方案 在引入S…

Java:“自动装配”继承与依赖注入 - java

Improve this question 我通常以常见的简单形式使用Spring框架: 控制器服务存储库通常,我会在CommonService类中放一个通用服务,并使所有其他服务扩展到类中。一个开发人员告诉我,最好在每个服务中插入CommonClass而不是使用继承。我的问题是,有一个方法比另一个更好吗? JVM或性能是否会受到另一个影响?更新资料Comm…

Hibernate:现实世界中的模式导出? - java

我很好奇我的下一个项目完全使用架构导出。我认为这是真正处理对象而非基础数据库的非常有用的方法。只需创建并注释模型,然后将其导出即可。但是从先创建表然后创建模型对象的习惯来看,我对完全使用模式导出有疑问。这主要是因为我真的很深入休眠。但是我仍然好奇使用模式导出时,该区域列表是否会成为问题。请分享您的经验..表之间的关系代理/复合主键支持当我只想从多个模型中导出…

JAVA 8具有任何匹配属性的对象的过滤器列表 - java

我的要求是通过匹配任何属性的字符串来过滤对象列表。例如,假设Contact类具有三个属性:街道,城市,电话。我知道java流过滤器是如何工作的,在这里我必须将输入字符串与每个属性进行比较,如下所示:contactList.stream().filter(contact -> contact.getStreet().equals("dubai&…