2017-04-30 7 views
0

私のコード要件に従って、組織やユーザーグループのモデルに対する少数のDBコールに基づいて計算されるユーザー関連の情報を取得する必要があります。私のパフォーマンスレビューによると、これは複数の場所で行われるため、処理に多くの時間がかかります。liferayの値をservicecontextに設定する

私はログイン時に一度だけこれを行うことを好みますが、この情報を格納して、ポータル全体(フック内、カスタムポートレット内、テーマなどで)。

これを達成するために、私はもっと良い解決策があるかどうかをチェックしたいと思っています(私はLiferayベースではないアプリケーションでセッションを使用しましたが、Liferayではフィッシングの問題に遭遇します)

ServiceContext sc = ServiceContextThreadLocal.getServiceContext(); 
String someUserData = (String)sc.getAttribute("some-user-data"); 

感謝を: - :

といくつかのポートレット/フックで、私は

ServiceContext sc = ServiceContextThreadLocal.getServiceContext(); 
sc.setAttribute("some-user-data", someUserData); 

! AJ

答えて

1

AFAIK ServiceContextは、単一の要求に耐えられるものではありません。このリクエストプロセッサによって処理される次のリクエストは、まったく異なるユーザーのために処理される可能性が最も高いため、処理される次のリクエストに対してThreadLocalがスローまたは再初期化されます。

キャッシュのディメンションを調べると、組織とユーザーのデータをデータベースからではなくキャッシュから取得できます。私はあなたがこれらを取得するためにLiferayのAPIを使用していると仮定しています。

あなたのコメントの後に編集:他のすべてのオプションが使い果たされた後は、最後の手段としてセッションに追加することを検討します。キャッシュの使用状況を最初に確認し、実際にはこれらの呼び出しによって多くの時間が浪費されていることを確認します。最初の呼び出しには時間がかかり、その後の操作は何度も呼び出されるだけでなく、リクエストごとにリクエストを検証するのではなく、システムを実際に使用して検証する:システムの1%のケースでのみ実行されるリクエストを最適化し、そのパフォーマンスを5%向上させる場合は、あなたは何も勝ちませんでした。代わりに、維持するのが難しく、クラスタを拡張し、セッションでデータを保存した後にデータベースが更新された場合に異常な動作をするシステムになります。

+0

**このServiceコンテキストからリクエストを取得し、** ServiceContextThreadLocal.getServiceContext()。getRequest()。getSession()**のようにセッションを取得してこのセッションに値を設定すると、それは大丈夫だろうと思いますか? これは、 "session.phishing.protected.attributes"プロパティのリストに各属性を追加することになりますか? – anjhawar

関連する問題