0

Liferay キャッシュに問題があります。

シナリオ : XML ファイルを読み込んで、Liferay API を使用してレイアウトを Liferay DB にインポートしています。

レイアウトのtypeSettings列には膨大なデータが格納されています。

問題 : 約 5000 のレイアウトをインポートすると、OutofMemoryExceptionが発生します。最も保持されているヒープ領域は、 EhCache オブジェクトによるものであることがわかりました。(私の巨大なタイプセットで LayoutCacheModel を保持します)

各レイアウトのインポート後にキャッシュをクリアするのは良い考えですか?

もしそうなら、どうすればレイアウトに固有のキャッシュをクリアできますか? ( Liferay 6.0を使用しています)

ありがとう、

シビー

4

3 に答える 3

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 に答える
0

ehcache のフラッシュを検討する前に (数百回ごとではなく、インポートごとに実行しない方がよいでしょう)、現在の JVM 設定を確認し、ポータルを実行している JVM に割り当てられる最大ヒープ サイズを増やすことを検討してください。例 -Xms1024m -Xmx1024m -XX:MaxPermSize=128m

さらに、ポータルのパフォーマンス チューニングについては、 Liferay のWeb サイトを参照してください(ただし、使用しているバージョンはわかりません)。

すでに 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+Configurationおよびhttps://www.liferay.com/web/guest/community/wiki/-/がありますwiki/Main/Liferay+Caching+%28EhCache%29 - ユーザー ガイドでさらに利用できると思います。

于 2012-11-29T12:42:27.090 に答える