2012-11-27 28 views
0

我的Liferay緩存有問題。如何在Liferay中清除佈局緩存

場景: 我正在閱讀XML文件並使用Liferay API將佈局導入到我的Liferay DB。

有大量數據存儲在typeSettings列的佈局。

問題: 當我進口5000左右佈局,我得到一個OutOfMemoryException異常。 我能找到最保留的堆空間是由EhCache對象。 (它擁有我的巨大排版LayoutCacheModel)

在每次佈局導入後清除緩存是否是一個好主意?

如果是這樣,我該如何清除特定於佈局的緩存。 (我用的Liferay 6.0

感謝,

西比

回答

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); 
} 

我不得不手動複製此代碼作爲其不作爲服務提供。

0

你看看刷新了Ehcache(可能是最好不要做它每次導入後,而之後每幾百)之前,看看您擁有的JVM設置,並考慮增加分配給運行門戶的JVM的最大堆大小。例如。 -Xms1024m -Xmx1024m -XX:MaxPermSize參數=128米

而且你應該看看Liferay's網站性能優化門戶(雖然我不知道你使用的是什麼版本)。

鑑於您已經配置了您的JVM設置,您可以查看在X加載後刷新ehcache(我仍建議您在大於1次加載後刷新它,而不是加載)。你可以得到一個句柄CacheManager與以下並刷新它:

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

我從來沒有在Liferay中做到了這一點但是我認爲它可能仍然會有一定的好處。

+0

感謝您的回答。沒有這是作爲間隔工作完成的。基本上我不需要在成功導入後通過緩存維護佈局。(我已經配置了我的最大堆大小) – simplysiby

+0

更新了答案。 – ramsinb

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 - 我希望更多的用戶指南可用。

+0

嗨奧拉夫......感謝您的回答。這正是我現在想要做的。但在中,我們如何配置緩存大小?我只能找到maxElementsInMemory(< - 我不想限制大小可以改變的數量)和overFlowToDisk。 – simplysiby