在我与Cassandra使用GemFire的项目中,我的CacheLoader
能够从Cassandra中提取数据,但是,GemFire中没有这些数据。从Cassandra获取数据后,GemFire中的数据没有更新。
我使用过以下代码:
public class TestLoader implements CacheLoader, Declarable {
@Autowired
private CassandraOperations cassandraOperations;
@Override
public void init(Properties props) {}
@Override
public Test load(LoaderHelper helper) {
String key = (String) helper.getKey();
key = key.replaceAll("\\s", "");
Select select = QueryBuilder.select().from("Testing");
select.where(QueryBuilder.eq(testkey, key));
return cassandraOperations.selectOne(select, TEST.class);
}
@Override
public void close() {}
}
测试 - 域类名称 测试 - Cassandra表名 testkey - Cassandra主键
答案 0 :(得分:1)
因此,CacheLoader
似乎没有select.where(..)
语句,而select.where(QueryBuilder.eq("testkey", key));
语句应该是CacheLoader
。很明显,这段代码无法编译。不过,除此之外,我对你的配置和拓扑感到好奇,正如张夏伟在上面的评论中指出的那样。显然,您使用的是客户端/服务器拓扑,但其范围并不明显,也不是您的配置。
您应该在服务器的缓存PARTITION
区域上注册此PARTITION
,而不是在客户端 Region 上注册(如果是是这样的)。无论服务器缓存 Region 是PARTITION_REDUNDANT
还是PROXY
都不重要。
但是,您的拓扑结构也需要了解很多,张夏伟也暗示。
在典型设置中,您的(缓存)客户端在CACHING_PROXY
或CACHING_PROXY
客户端区域中请求缓存条目(按键)。如果该条目在本地不可用或无效(在PROXY
配置中),则将请求转发(具有CacheLoader
,请求始终转发)到具有的服务器区域的名称相同(例如" Test")。如果该条目在服务器的 Region 中不可用,并且已注册CacheLoader
,则会调用具有该密钥的CacheLoader
。在您的情况下,条目的数据将从Cassandra加载(如上所示)和" put"使用配置的Pool
(再次,必须配置服务器端)进入服务器 Region ,然后返回到客户端。
现在,如果你涉及多个客户(可能是你的情况),那么你需要确保你有"订阅"已启用,您需要在客户所需的特定密钥或密钥中注册兴趣。或者,您可以使用CQ(推荐)来定义(GemFire OQL)查询谓词,以更简洁地表达您有兴趣接收通知的数据。
与客户PROXY
| CACHING_PROXY
地区和"兴趣"相关联的layer
上的订阅configured/enabled (例如,by key(s)或using regex,带有重载的变体)用 Region API表示。
您可以找到有关配置客户端/服务器事件消息 here的更多信息。此外,您应该考虑Continuous Queries。
您还应该通过阅读this确保您真正了解客户端/服务器消息,尤其是拓扑中的多个客户端。
还有其他可用的配置选项,如服务器端,例如consistency checking,尤其是当您在PR中配置了冗余时,其中一个客户端可能正在访问冗余副本,但这应该少于这是一个问题。
从技术上讲,它更可能是您的客户端队列的问题,因为客户端队列是异步更新的,而从服务器发送到客户端的通知是不确定的,正如文档所指出的那样......
5。条目X的事件从队列发送到Client2。发生这种情况时是不确定的。
无论如何,从这开始。确保来自单个客户端的请求/加载/更新首先是一致的,然后涉及其他客户端。确保您已表达了正确的利益政策等。请阅读我提供的链接中的文档。
希望这有帮助!
此致 约翰