ApacheIgnite、不带过滤器的扫描查询和缓存上的迭代器都返回空结果集。缓存中的条目数不是零

ApacheIgnite、不带过滤器的扫描查询和缓存上的迭代器都返回空结果集。缓存中的条目数不是零,ignite,Ignite,ApacheIgnite版本:2.8.0 在启动第一个ignite缓存节点时,在代码段下面给出预期的输出。当第二个ignite缓存加入集群时,第一个代码段中的entries对象为空,而第二个代码段中的iter.hasNext()为false ignite群集以ShareNothing持久性启动 缓存模式设置为CacheMode.REPLICATED 两个节点都处于服务器模式 两个实例中对size()的调用都给出一个非零值 调用localSize()在第一个实例中给出非零值,但在第二个实例

ApacheIgnite版本:2.8.0

在启动第一个ignite缓存节点时,在代码段下面给出预期的输出。当第二个ignite缓存加入集群时,第一个代码段中的entries对象为空,而第二个代码段中的iter.hasNext()为false

  • ignite群集以ShareNothing持久性启动

  • 缓存模式设置为CacheMode.REPLICATED

  • 两个节点都处于服务器模式

  • 两个实例中对size()的调用都给出一个非零值

  • 调用localSize()在第一个实例中给出非零值,但在第二个实例中给出0

     Map results = new HashMap();
     QueryCursor<Cache.Entry> entries = binaryCache.query(new ScanQuery(null));
     logger.log(Level.DEBUG, "CacheSize from entrySet: [%s]", binaryCache.size()); // Outputs non zero number. 
     try {
       for (Cache.Entry e : entries) {
         results.put(e.getKey(), e.getValue());
       }
     } catch (IOException e) {
         throw new RuntimeException("Error deserializing ignite entry", e);
     }
     return results.entrySet();
    
    Map results=newhashmap();
    QueryCursor entries=binaryCache.query(newscanquery(null));
    logger.log(Level.DEBUG,“来自entrySet:[%s]”,binaryCache.size());//输出非零数字。
    试一试{
    for(Cache.Entry e:条目){
    results.put(e.getKey(),e.getValue());
    }
    }捕获(IOE异常){
    抛出新的RuntimeException(“反序列化ignite条目时出错”,e);
    }
    返回结果。entrySet();
    
  • Map results=newhashmap();
    迭代器iter=binaryCache.Iterator();
    logger.log(Level.DEBUG,“来自entrySet:[%s]”,binaryCache.size());//输出非零数字。
    试一试{
    while(iter.hasNext()){
    Cache.Entry e=iter.next();
    results.put(e.getKey(),e.getValue());
    }
    }捕获(IOE异常){
    抛出新的RuntimeException(“反序列化ignite条目时出错”,e);
    }
    返回结果。entrySet();
    

    当null传递给ScanQuery时,理想情况下,应该从缓存中提取所有条目。

    IgniteCache是可编辑的,正如您在第二个示例中注意到的那样。 如果需要获取存储的值,最简单的代码如下:

            IgniteCache<Object, BinaryObject> myCache = ignite.getOrCreateCache(ccfg).withKeepBinary();
            for(Cache.Entry<Object, BinaryObject> entry: myCache){
                System.out.println(entry.getKey() + " " + entry.getValue());
            }
    
            System.out.println("trying again");
    
            for(Cache.Entry<Object, BinaryObject> entry: myCache){
                System.out.println(entry.getKey() + " " + entry.getValue());
            }
    
    IgniteCache myCache=ignite.getOrCreateCache(ccfg).withKeepBinary();
    for(Cache.Entry:myCache){
    System.out.println(entry.getKey()+“”+entry.getValue());
    }
    System.out.println(“重试”);
    for(Cache.Entry:myCache){
    System.out.println(entry.getKey()+“”+entry.getValue());
    }
    
    正如您在第二个示例中注意到的,IgniteCache是可移植的。 如果需要获取存储的值,最简单的代码如下:

            IgniteCache<Object, BinaryObject> myCache = ignite.getOrCreateCache(ccfg).withKeepBinary();
            for(Cache.Entry<Object, BinaryObject> entry: myCache){
                System.out.println(entry.getKey() + " " + entry.getValue());
            }
    
            System.out.println("trying again");
    
            for(Cache.Entry<Object, BinaryObject> entry: myCache){
                System.out.println(entry.getKey() + " " + entry.getValue());
            }
    
    IgniteCache myCache=ignite.getOrCreateCache(ccfg).withKeepBinary();
    for(Cache.Entry:myCache){
    System.out.println(entry.getKey()+“”+entry.getValue());
    }
    System.out.println(“重试”);
    for(Cache.Entry:myCache){
    System.out.println(entry.getKey()+“”+entry.getValue());
    }
    
    如果缓存有缓存存储,它可能会去同步,因为缓存存储负载不会跨集群传播。这就是缓存存储在复制缓存上的工作方式。

    如果缓存有缓存存储,它可能会去同步,因为缓存存储负载不会跨集群传播。这就是缓存存储在复制缓存上的工作方式。

    您的代码片段看起来正常,应该可以。有可能得到一个完整的复制机吗?例如,如何获取缓存实例并调用迭代器?@AlexandrShapkin,对于每个缓存实例-->ignite.getOrCreateCache(cacheConfig).withKeepBinary();所有节点都处于服务器模式。@AlexandrShapkin,我添加了更多的观察结果。如果有用的话,请看一看。您确定没有以某种方式删除条目,并且没有在同一迭代器上进行迭代吗?另外,还不清楚,你的目标是什么?如果您只想获取存储的值,那么缓存对象本身是可编辑的,最好使用第二个示例。请用代码示例检查答案,并尝试运行它。您的代码片段看起来不错,应该可以。有可能得到一个完整的复制机吗?例如,如何获取缓存实例并调用迭代器?@AlexandrShapkin,对于每个缓存实例-->ignite.getOrCreateCache(cacheConfig).withKeepBinary();所有节点都处于服务器模式。@AlexandrShapkin,我添加了更多的观察结果。如果有用的话,请看一看。您确定没有以某种方式删除条目,并且没有在同一迭代器上进行迭代吗?另外,还不清楚,你的目标是什么?如果您只想获取存储的值,那么缓存对象本身是可编辑的,最好使用第二个示例请用代码示例检查答案并尝试运行它