【问题标题】:executorservice to read data from database in chuncks and run process on themexecutorservice 以块的形式从数据库中读取数据并在其上运行进程
【发布时间】:2014-07-23 06:47:22
【问题描述】:

我正在尝试编写一个从数据库读取数据并将其上传到云数据存储的进程。

如何确定数据的分区策略?我想分块查询表并在 10 个线程中处理每个块。每个线程基本上会将数据发送到云上 10 节点集群上的单个节点..

在下面的多线程代码中,数据查询将提取并发送 10 个并发请求以将数据上传到云端?非常重要的是,如果出现故障,我不会松开我的数据库查询迄今为止处理的游标,因此在数据库中,一旦处理了一批 100 条记录,它应该将这些记录状态从 PENDING 更新为 DONE该记录的数据库列。此作业将每 10 分钟运行一次以从源数据库中提取数据。

public class Caller {
    public static void main(String[] args) {

        ExecutorService executor = Executors.newFixedThreadPool(10);

          for (int i = 0; i < 10; i++) {
                Runnable worker = new DomainCDCProcessor(i);
                executor.execute(worker);
              }
            executor.shutdown();
            while (!executor.isTerminated()) {
            }
            System.out.println("Finished all threads");
        }


    }

【问题讨论】:

  • 我会做一种循环。不过,这个问题似乎有点模棱两可。
  • 这是一个“仅一次”的过程,还是定期运行的过程?
  • 我不认为保持光标是一个好主意。改为将 ORDER BY 添加到您的查询中,并保留最后处理的 id(或时间戳,或一些更独特的字段)。在下一个查询设置限制或添加条件,如 WHERE ID>lastProcessedId

标签: java multithreading executorservice threadpoolexecutor


【解决方案1】:

在启动工作程序之前进行选择以确定要处理的记录的所有主要 ID 的集合或范围(第一个 ID - 最后一个 ID)。给每个工人一个子集或范围部分来工作。确保工人永远不会离开给定的集合或范围。

【讨论】:

  • 谢谢vanOekel,有什么我可以使用的例子吗?我可以阅读任何代码以了解如何将执行程序与数据库一起使用?谢谢!
猜你喜欢
  • 2013-10-14
  • 2013-03-05
  • 2018-04-06
  • 2011-03-31
  • 2012-07-23
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多