【问题标题】:Database multithreading with preserved sequence updates on primary key数据库多线程,在主键上保留序列更新
【发布时间】:2017-07-05 08:02:07
【问题描述】:

有很多数据要处理,我试图让它们并行。

class Item{
    Integer id;
    String data;
}


ExecutorService executor = Executors.newFixedThreadPool(10);

for (Item item : items) {
            executor.execute(() -> putItemToDB(item));
        }

但是发生的问题是,在一个测试用例中,我有前 6 个任务指向同一个主键。具有相同主键(id)的任务的顺序很重要,不能更改。目前,我无法保证。

例子:

items = [{id: 1, data: "a"}, {id: 1, data: "b"}, {id: 2, data: "g"}]

我必须知道a之前 b,并且在线程池中运行所有任务并不能保证这一点。 a 有可能会覆盖 b

有什么好的设计模式可以解决这个问题吗?

【问题讨论】:

  • 不清楚您在问什么,因为这段代码中没有任何内容可以揭示“具有相同主键的任务顺序” 的实际含义。
  • 我改进了我的问题。我希望现在没事。

标签: java spring multithreading parallel-processing amazon-dynamodb


【解决方案1】:

此用例的良好设计模式是为每个 id 使用单独的 Actor 实例。项目被发送到相应的参与者,并按顺序保存在输入队列中。 Actor 从队列中取出下一个项目并保存在数据库中。 要找到键的参与者,可以使用 HashMap。

如果有太多不同的id和太多的actor,actor可以检查它的输入队列是否有一段时间为空,然后从HashMap中注销自己。

还可以优化这样的参与者,以便可以使用单个项目的变量来代替输入队列。如果在前一个项目尚未写入数据库时​​另一个项目到达,新项目只是重写前一个项目 - 无论如何,写入旧项目没有意义,它将在数据库中被覆盖。

可以在https://github.com/akaigoro/CodeSamples/blob/master/src/main/java/actor/simpleactor/SimpleActor.java找到一个简单的演员开始

【讨论】:

  • 我已经简化了我的问题,因为我不想让它变得太复杂,但我必须让每条记录都保存 id DB,即使它会被覆盖。感谢您的回答,我会阅读更多内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 2012-03-19
  • 2010-11-12
  • 2017-07-31
  • 2019-06-20
相关资源
最近更新 更多