如果使用spring和JPA,則很有可能利用ehcache(或其他緩存提供程序)。 您可以在兩種不同的情況下進行此操作:JPA 2級緩存和spring方法緩存。
在配置應用程序時,通常會設置JPA提供程序的二級緩存提供程序(在我的情況下為休眠),并且還使用“緩存”名稱空間配置spring。 一切看起來都很好,您將繼續進行該項目。 但是有一個警告。 如果采用最直接的方法,則會得到兩個單獨的緩存管理器,它們加載相同的緩存配置文件。 從本質上來說,這還不錯,但是要考慮一下–您是否真的需要兩個緩存管理器,以及由此可能引起的問題?
可能你不會。 因此,您必須擺脫冗余管理器。 為此,您需要將spring緩存管理器設置為共享:
<bean id='ehCacheManager'class='org.springframework.cache.ehcache.EhCacheManagerFactoryBean'><property name='shared' value='true' />
</bean>
這意味著spring將不會創建緩存管理器的新實例,而是將重用hibernate已經創建的實例。 現在,這里需要考慮一些問題-這取決于bean創建的順序–是將JPA工廠bean還是緩存管理器工廠bean放在首位。 幸運的是,這與最終結果無關緊要,因為SingletonEhCacheRegionFactory
如果找到現有實例,則會重用現有的緩存管理器實例。
因此,現在您已將緩存管理器設置為jvm-singleton。 但是,如果您部署了多個應用程序并且正在使用JMX,則可能會遇到另一個問題。 緩存管理器將其自身注冊為JMX bean。 但是,當您有單身人士時,多個應用程序將嘗試多次注冊同一緩存管理器,這將失敗。 結果將是日志中有幾個例外,并且無法控制多個模塊的緩存管理器。 如果您使用Terracotta之類的東西,則同樣的問題會變得很麻煩(緩存管理器的身份很重要)。 幸運的是,您可以輕松解決此問題。 只需向上面顯示的bean定義添加一個屬性:
<property name='cacheManagerName' value='${module.name}' />
${module.name}
是使用PropertyPlaceholderConfigurer解析的PropertyPlaceholderConfigurer
并且可以針對每個${module.name}
應用程序進行配置,因此每個Web應用程序可以具有不同的模塊名稱。 這樣,可以通過JMX以指定的名稱訪問緩存管理器。
總體而言,請謹慎使用緩存管理器。 即使在使用不同的緩存,jpa和DI提供程序的情況下,也應驗證上述方案。
參考:在Bozho的技術博客博客上, 請注意我們JCG合作伙伴 Bozhidar Bozhanov的 緩存管理器 。
翻譯自: https://www.javacodegeeks.com/2013/01/be-careful-with-cache-managers.html