使用ClientRegionShortcut.CACHING_PROXY_HEAP_LRU的GemfireTemplate不会在本地缓存

时间:2017-11-23 12:15:39

标签: spring-boot gemfire spring-cache spring-data-gemfire geode

clientCache.createClientRegionFactory(ClientRegionShortcut.CACHING_PROXY_HEAP_LRU)spring-cache GemfireCacheManager一起使用时会按预期工作,并在本地缓存数据。

然而,当相同的设置与GemfireTemplate一起使用时,使用Gemfire作为repo而不是缓存,似乎并没有在本地缓存数据 at all 和总是从服务器取回。

我将值存储为一个小的Hashmap,并尝试将堆内存增加到-Xms1024m -Xmx2148m,以减少堆内存的影响而不起作用。

什么我错过了吗?

1 个答案:

答案 0 :(得分:0)

首先,为什么你(可能?)使用GemFire的API创建一个ClientCache.createClientRegionFactory(:ClientRegionShortcut)的客户区域,特别是在 Spring 上下文中?要在 Spring 上下文中正确管理GemFire对象的生命周期,您应该使用 Spring Data GemFire 和SDG的配置,XML或(最好) Annotation-based

其次,这......

  

但是当相同的设置与GemfireTemplate一起使用时,要使用Gemfire作为repo而不是缓存,似乎本地缓存数据并始终提取从服务器返回。

相当弱的论点。是什么让你认为“ 似乎 ”在本地缓存数据?

您是否观察过GemFire日志中的输出以支持您的声明?你有没有写过测试来证实你的假设?什么是 Spring (?)配置,以便在 Spring 上下文中配置GemFire,同时通过GemfireTemplate获取对Region的访问权限?你使用的是什么版本的Spring Data GemFire?等等。

您是否理解GemfireTemplatewrapper for a GemFire Region(使用模板软件设计模式,与 Spring的 {的目的相同{3}})?任何JdbcTemplate操作都有效GemfireTemplate.put(key, value)

  

注意:使用各种 Spring 模板可以使应用程序的数据访问操作方便地使用其他功能进行修饰,例如翻译特定于数据存储的例外(例如GemFire,并且经常错误地“检查”例外)在 Spring的所有重要的数据访问calls Region.put(key, value)中,同时允许您的应用程序数据访问操作在Transactional范围内正确参与事务,而无需编写像tx.begin()这样的样板代码以及tx.commit()tx.rollback()。总之...

所以,即使您的代码看起来有点像......

RegionFactory exampleRegionFactory = clientCache.createClientRegionFactory(ClientRegionShortcut.CACHING_PROXY_HEAP_LRU);

// 1. call various setters to configure the Region created by the factory
exampleRegionFacatory.set...
...

// 2. create the Region
Region exampleRegion = exampleRegionFactory.create("Example");

// 3. interface to the Region via the GemfireTemplate
GemfireTemplate exampleTemplate = new GemfireTemplate(exampleRegion);

// 4. put key/value into /Example Region
examleTemplate.put("myKey", "myValue");

这有什么不同,而不是4,只是这个......

exampleRegion.put("myKey", "myValue");

最后,考虑一下我写的Exception Hierarchy ......

此测试类为test class Spring Data GemFire 2.0.1.RELEASE。

此测试类based on用于启动小型GemFire集群(定位器和服务器),并在每次测试运行后检查服务器(如果您愿意)。但是,为了在测试运行后检查服务器的状态,您需要注释掉includes a Gfsh shell script。但是,您必须记住在使用remove --region=/Example --key=testKey进行下一次测试之前擦除服务器上的数据,否则this line失败,显然!

如您所见,我有客户this assertion(如上所述)。您可以尝试使用不同的ClientRegionShortcuts来查看其效果。此测试类将传递除ClientRegionShortcuts之外的所有ClientRegionShortcut.PROXY(当然,它不会在客户区域中“本地”存储任何数据,因此具有 NO 大小) 。使用LOCAL - 仅基于ClientRegionShortcuts,您无需运行服务器。

最后,我创建了2个 Spring 配置文件,Region data policy set with the ClientRegionShort.CACHING_PROXY_HEAP_LRU(配置文件“ Spring Data GemFire ”)以及Spring Data GemFire Annotation-based configuration approach(个人资料“ GemFireApi ”)。不要使用后者,特别是在 Spring 上下文中。我写了这个配置文件纯粹证明如果你使用上面的客户端区域配置片段,它仍然可以工作!

您可以使用 Spring TestContext @ActiveProfiles注释GemFire API-based approach切换配置文件。

最后要注意的是,Region.size()方法只将本地(客户端)Region的大小视为like so,其中Region.sizeOnServer()将检查相应的(按名称)服务器Region的大小(explained in the Javadoc)。

此测试按预期传递

希望这有帮助!

-John