我的Liferay缓存存在问题。
情景: 我正在阅读一个XML文件,并使用Liferay API将布局导入我的Liferay数据库。
布局的 typeSettings 列中存储了大量数据。
问题: 当我导入大约5000个布局时,我得到 OutofMemoryException 。 我可以通过 EhCache对象找到最保留的堆空间。 (它包含我的巨大排版的LayoutCacheModel)
在每次布局导入后清除缓存是否是个好主意?
如果是这样,我如何清除特定于布局的缓存。 (我正在使用 Liferay 6.0 )
谢谢,
Siby
答案 0 :(得分:0)
在您查看刷新ehcache之前(可能最好不要在每次导入后而不是每几百次之后执行此操作),查看您拥有的JVM设置并考虑增加分配给运行门户的JVM的最大堆大小。例如。 -Xms1024m -Xmx1024m -XX:MaxPermSize = 128m
此外,您应该查看Liferay's网站以了解门户网站的性能(虽然我不确定您使用的是哪个版本)。
鉴于您已经配置了JVM设置,您可以在X加载后查看刷新ehcache(我仍然建议您在> 1加载后刷新它而不是加载)。您可以使用以下内容获取CacheManager
的句柄并将其刷新:
CacheManager manager = CacheManager.getInstance();
manager.removalAll();
我自己从未在Liferay中做过这件事,但我认为它可能仍然有一些好处。
答案 1 :(得分:0)
您也可以配置缓存大小,而不是完全清空缓存。监视JMX数据以确定实际缓存的大小,并根据您的需要采用。缓存配置的一些文档是https://www.liferay.com/community/wiki/-/wiki/Main/ehCache+Configuration和https://www.liferay.com/web/guest/community/wiki/-/wiki/Main/Liferay+Caching+%28EhCache%29 - 我希望在用户指南中提供更多文档。
答案 2 :(得分:0)
与 @ramsinb 给出的答案类似,我可以使用以下代码清除缓存:
<强> LayoutPersistenceImpl.java 强>
public void clearCache() {
if (_HIBERNATE_CACHE_USE_SECOND_LEVEL_CACHE) {
CacheRegistryUtil.clear(LayoutImpl.class.getName());
}
EntityCacheUtil.clearCache(LayoutImpl.class.getName());
FinderCacheUtil.clearCache(FINDER_CLASS_NAME_ENTITY);
FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST);
}
我不得不手动复制此代码,因为它不可用作服务。