java - Ignite 线程池使用 - 如何正确地将数据并行放入缓存中?

标签 java multithreading ignite

正如文档中所述,Ignite 提供了系统线程池来处理缓存相关操作。 我的问题是数据放置,但流式和批量加载不是解决方案,因为数据来自多个客户端通过 REST 查询,并且需要对每个查询进行快速写入确认。

所以我正在寻找一种并行执行 cache.put() 操作的方法。第一个问题是——简单的 cache.put() 不是并行执行的吗? 我发现我可以调用 Ignite 自定义 ExecutorService,如下所示:

 ExecutorService exec = ignite.executorService();
 <...>
 exec.submit(new IgniteRunnable() {
      @Override public void run() {
        System.out.println("data put");
        cache.put(i, somedataobj);
                            }});

然后所有放置操作在所有节点上并行执行(因为我在所有节点的控制台输出中看到“数据放置”)。但是我认为并行放置不是一个合适的方法,因为数据首先发送到工作节点,然后才被放入。

另一种方法是像这样使用 Java 普通固定线程池:

        ExecutorService exec = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            int t = i;
            DataClass dataobj = data().build();
            exec.submit(new IgniteRunnable() {
                            @Override public void run() {
                                System.out.println("data put");
                                cache.put(t, dataobj);
                            }});

        }

        exec.shutdown();
        exec.awaitTermination(0, TimeUnit.MILLISECONDS);
        long stopTime = System.currentTimeMillis();
        long elapsedTime = stopTime - startTime;
        System.out.println(elapsedTime);

但随后我遇到了另一个问题 - 数据加载速度非常快(我得到的 elapsedTime 很小),但出现在缓存中的时间很晚(当我通过 ignite visor 执行 cache -a 时,我看到缓存如何规模正在增长)

如何正确地并行放置数据?如何使用 Ignite 系统线程池并行放置数据?

最佳答案

关于java - Ignite 线程池使用 - 如何正确地将数据并行放入缓存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49003821/

相关文章:

java - Ignite 上的 Spark 是否使用 Ignite 的 Job Stealing(如果已设置)?

hadoop - 具有远程部署的Hadoop键值存储

java - 如何使用扩展来访问值父类(super class)

java - getValueAt() 将数据库中的条目加倍

java - 如何在java中向JPanel添加Applet

swift - 如何使用 Swift 在 FireBase 数据库中发生更改时获取计数值?

objective-c - 如何包装异步类使其同步?使用 NSRunLoop?

Java 不使用所有可用的 CPU

java - 在 Ignite 缓存中插入数据时出现以下错误?

java - 如何避免库 jar 中的资源冲突?