[英]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.