簡體   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