[英]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)
本质上只是迭代传入Map
的Map.Entries
并为每个Map.Entry
( this , this和this )分别调用Region.put(key, value)
),则显然它并没有给您太多购买,当然也没有理由在将所有数据放入该区域之前将其存储在内存中。
例如,大多数ResultSets
都是使用DB游标实现的,该游标允许您一次获取一定数量的行,但并非所有可能的行。 显然,您的SQL查询甚至可以根据兴趣/针对性更选择性地选择返回哪些行,可以考虑仅加载最重要数据的子集,或查询谓词中指定的某些其他条件。 然后,只需在迭代ResultSet
时将数据放入Region中即可。
值得深思。
-约翰
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.