2016-09-15 10 views
1

我们将为我们的项目实施gemfire。我们目前正在将gemfire缓存与我们的DB2数据库同步。所以,我们在将DB数据放入缓存时遇到了问题。如何从gemfire cacheloader获取多个数据?

将DB数据放入区域。我实现了com.gemstone.gemfire.cache.CacheLoader并覆盖它的加载方法。正如在java中所写的doc加载方法将只返回一个Object。但是,对于我们的要求,我们将不得不从负载方法

public List<CmDvceInvtrGemfireBean> load(LoaderHelper<CmDvceInvtrGemfireBean, CmDvceInvtrGemfireBean> helper) 
      throws CacheLoaderException 

返回多个VO虽然List<CmDvceInvtrGemfireBean>的GemFire区域的形式returining多个VO认为它是单值。

所以,当我调用,

System.out.println("return COUNT" + cmDvceInvtrRecord.query("SELECT COUNT(*) FROM /cmDvceInvtrRecord")); 

它返回一个计数。但是我可以看到总共7个数据。

所以,我想要实现的一种机制,将要把所有的7个值,如区域

一个单独的VO有没有办法做到这一点使用的GemFire缓存加载器?

回答

0

A CacheLoader仅用于加载缓存未命中时GemFire Region中单个条目的值。正如Javadoc ...

..creates用于期望值..

虽然键可映射到一个多值(例如阵列/收藏)值,CacheLoader只能填充单个条目。

您将不得不采取其他方式在单个操作中用多个“条目”填充缓存。

出于好奇,为什么你需要(需求?)一次加载多个条目(从数据库)?你是否想尽量减少往返数据库的次数?

此外,您使用什么逻辑来决定基于CacheLoader中提供的信息(即密钥)将从DB装载什么VO?

例如,你是否想方设法从数据库中预先选择基于CacheLoader密钥的值,以便随后最大程度地减少未来Region.get(key)调用中的缓存未命中?

对不起,我现在没有更好的答案,但对这些问题的回答可能会帮助我给你一些替代方案的一些想法。

干杯, 约翰

+0

我有复合材料(帐号和设备序列号),用于相应的表的主键。根据业务需求,用户将只提供帐号。所以,基于这个帐户,我想一次将所有设备加载到表中的区域。那么,我可以使用CacheLoader吗? –

+0

@JohnBlum,让我选择你的大脑,关于可预测的加载值。你有没有想到如何实现这样的事情,只要在cacheloader中提供一些可用的上下文。 – Newbie