通过从Spring Boot应用程序加载数据Map来初始化GemFire缓存

时间:2018-01-10 12:20:24

标签: java spring-boot caching gemfire spring-data-gemfire

我正在尝试开发一个缓存应用程序,它将在服务器启动时加载自身,客户端应用程序将能够通过REST服务调用读取缓存数据。

因此,我必须在部署应用程序时初始化GemFire缓存。 这会将数据(从RDBMS中导出数据)以Map的形式加载到缓存中。

我看到CacheLoader一次将一个条目加载到GemFire区域,但是Region.putAll(map)一次可以加载所有数据还是有其他方法?

请帮忙。

2 个答案:

答案 0 :(得分:0)

我相信<initializer>元素将完全匹配您的用例。它曾经用于Launch an Application after Initializing the Cache,它当然可以用于在缓存初始化时填充区域。

还有其他选项,比如编写自定义Function并在启动脚本返回后立即执行它,但我认为<initializer>元素在此处是合适的。

希望这会有所帮助。 欢呼声。

答案 1 :(得分:0)

我会非常小心地从您的基础数据源中提取所有数据,例如:来自RDBMS,在内存中,在java.util.Map中,因为根据结果集的大小,很快就会很快耗尽内存(因此OutOfMemoryError)。

尽管如此,如果你想要一个这样的例子,请参阅here;配置为here

基本上,我使用Spring BeanPostProcessor RegionPutAllBeanPostProcessorMap数据放入“目标”区域。

例如,我have a Region(即“RegionOne”),我可以将RegionPutAllBeanPostProcessortarget this Regionput data用于区域from the Map。< / p>

显然,在触发此区域加载/“加温”时,您有许多不同的选项:GemFire初始化程序,Spring BeanPostProcessor(文档here)或甚至是Spring {{3} }倾听ApplicationListener,例如点击ApplicationContextEvents(文档ContextRefreshedEvent)。

但是,虽然此测试中的Map是用XML进行硬编码的,但您可以设想从任何数据源填充此Map,包括从执行的SQL查询派生的java.sql.ResultSet反对RDBMS。

所以,也许更好的方法/解决方案,不会消耗尽可能多的内存,可能是使用一个BBP“注入”Spring的here或JPA EntityManager,甚至更好,使用JdbcTemplate,并从您选择的框架加载数据,将数据直接放入Region。毕竟,如果Region.putAll(:Map)基本上只是迭代传入Map.Entries的{​​{1}}并为每个Map Spring Data JPA单独调用Region.put(key, value)thisthis),显然它不会给你那么多买,当然也不能证明在将所有数据放入区域之前将其放入内存中。

例如,大多数Map.Entry都是使用DB游标实现的,它允许您一次获取一定数量的行,但不是所有可能的行。显然,您的SQL查询甚至可以更加选择性地基于兴趣/相关性返回哪些行,考虑仅加载最重要数据的子集,或者查询谓词中可指定的其他一些条件。然后只需在迭代ResultSets时将数据放入Region中。

深思熟虑。

-John