0

我的 Liferay 缓存有问题。

场景: 我正在读取一个 XML 文件并使用 Liferay API 将布局导入我的 Liferay DB。

布局的typeSettings列中存储了大量数据。

问题: 当我导入大约 5000 个布局时,我得到一个OutofMemoryException。我发现保留最多的堆空间是EhCache 对象。(它拥有带有我巨大排版的 LayoutCacheModel)

每次布局导入后清除缓存是个好主意吗?

如果是这样,我如何清除特定于布局的缓存。(我正在使用Liferay 6.0

谢谢,

西比

4

3 回答 3

0

在查看刷新 ehcache 之前(最好不要在每次导入后而是在每几百次之后进行),查看您拥有的 JVM 设置并考虑增加分配给运行门户的 JVM 的最大堆大小。例如 -Xms1024m -Xmx1024m -XX:MaxPermSize=128m

此外,您应该查看Liferay 的网站以调整门户的性能(尽管我不确定您使用的是哪个版本)。

鉴于您已经配置了 JVM 设置,您可以查看在 X 加载后刷新 ehcache(我仍然建议您在 >1 次加载后刷新它,而不是永远加载)。您可以CacheManager使用以下方法处理并刷新它:

CacheManager manager = CacheManager.getInstance();
manager.removalAll();

我自己从未在 Liferay 中这样做过,但我认为它可能仍然有一些好处。

于 2012-11-27T10:22:28.703 回答
0

您还可以配置缓存大小,而不是完全清空缓存。监视 JMX 数据以确定您的实际缓存有多大,并根据您的需要采用。缓存配置的一些文档是https://www.liferay.com/community/wiki/-/wiki/Main/ehCache+Configurationhttps://www.liferay.com/web/guest/community/wiki/-/ wiki/Main/Liferay+Caching+%28EhCache%29 - 我希望在用户指南中提供更多内容。

于 2012-11-29T12:42:27.090 回答
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);
}

我不得不手动复制此代码,因为它不能作为服务使用。

于 2013-02-06T13:09:22.960 回答