繁体   English   中英

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

[英]Initialize a GemFire cache by loading a Map of data from Spring Boot application

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

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

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

请帮忙。

我相信<initializer>元素将非常适合您的用例。 它用于在初始化Cache后启动应用程序 ,并且可以肯定地用于在初始化缓存时填充区域。

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

希望这可以帮助。 干杯。

对于将来自底层数据源(例如,来自RDBMS的数据)的所有数据放入内存中的java.util.Map ,我将非常小心,因为非常容易很快用完内存(因此OutOfMemoryError )取决于结果集的大小。

但是,如果您想要一个示例,请参见此处 配置在这里

本质上,我使用的是Spring BeanPostProcessor (即RegionPutAllBeanPostProcessor) ,将数据Map放入“目标”区域。

例如,我有一个Region (即“ RegionOne”),并且可以使用RegionPutAllBeanPostProcessor 定位此Region 并将数据 从Map放入Region中。

很显然,你有很多不同的选择,当谈到触发该区域负载/“升温”:一个的GemFire初始化器,一个Spring BeanPostProcessor (文档在这里 ),或者甚至是春天ApplicationListener监听ApplicationContextEvents ,如在ContextRefreshedEvent (文件在这里 )。

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

因此,也许不会消耗太多内存的更好的方法/解决方案是使用通过Spring的JdbcTemplate或JPA EntityManager “注入”的BBP,或者甚至更好的是,使用Spring Data JPA并从中加载数据您选择的框架直接将数据放入区域。 毕竟,如果Region.putAll(:Map)本质上只是迭代传入MapMap.Entries并为每个Map.Entrythisthisthis )分别调用Region.put(key, value) ),则显然它并没有给您太多购买,当然也没有理由在将所有数据放入该区域之前将其存储在内存中。

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

值得深思。

-约翰

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM