ShowTable of Contents
はじめに
XPages アプリケーション開発で、「可視」設定ので「値の計算」はパフォーマンス低下を招く可能性があります。「可視」評価の Javascript に複雑な処理を実装する必要があるときには、そのスクリプトが思いがけずに複数回実行されることがあり、それがパフォーマンスの低下につながります。この問題を考えるとき、XPages の処理の木曽となっている JavaServer Faces (JSF) のライフサイクルを理解する必要があります。以下の記事は XPages と JSF ライフサイクルの関係を解説し、「可視(rendered)」プロパティの問題について解説しています。
また以下の記事は、XPages アプリケーションの中で実際に JSF のライフサイクルの動きを調べるための方法について解説しています。
この記事では、JSF ライフサイクルを考慮して、「可視」プロパティの実践的な設定方法を検討します。
「可視」プロパティの問題と解決策
先のふたつの記事で解説したように、XPages のフレームワークである JSF ライフサイクルからみると、XPages のコントロールに対する評価は一回ではなく、複数回行われることがあります。このような XPages の仕組みを理解せずにアプリケーションを開発すると、予想外のオーバヘッドが発生し、アプリケーションのパフォーマンスの低下を引き起こすばかりではなく、サーバーの負荷増大やメモリリークの間接的原因ともなります。
特にコントロールの可視設定を制御する「可視(rendered)」プロパティには注意が必要で、画面更新時に4回呼び出されたり、ページの部分更新で更新の対象でもないのに呼び出されることがあります。そのため「rendered」プロパティには、処理の重いスクリプトを実装することは避けたほうが良いでしょう。
しかし、実際のアプリケーション開発ではコントロールの可視設定を行う必要は必ず出てきます。そしてそのようなときに Lotus Notes アプリケーションなどのデータを参照したいということはありえるでしょう。では、そのようなときにはどのように実装すべきか?
「rendered」プロパティに重い処理の実装することでのパフォーマンスの低下を避けるための方法として、以下のような方法があります。
-
プロパティの「値の計算」で「動的に計算」ではなく「ページの呼び出し時に計算」を選択する。
-
「rendered」プロパティではなく、「loaded」プロパティを使用する。
-
スコープ変数を使うなどして同じ処理を繰り返さない。
-
view.isRenderingPhase() メソッドで Rendering フェーズのみで処理を行う。
プロパティの計算でく「ページの呼び出し時に計算」を選択する
「可視(rendered)」プロパティだけではないですが、「値の計算」で表示されるスクリプトエディタでは、値の計算のタイミングとして「動的に計算」と「ページ読み込み時に計算」のいずれかを選択することができます。「動的に計算」を選択すると、先の記事に紹介したように複数の JSF フェーズでスクリプトの処理が実行されてしまいます。「ページ読み込み時に計算」を選択することで、Restore View フェーズでのスクリプトの実行となり、スクリプト処理の負荷を下げることができます。しかし、「ページ読み込み時に計算」を選択すると、スクリプトの評価はページ生成時のみとなり、更新時には評価されません。また Restore View フェーズで処理が行われるため、ページ内のコントロールが実体化されておらず、コントロールの値を取得できないといった制限もあります。
ところで、「動的に計算」と「ページ読み込み時に計算」とで XPages のソース上でどのような違いがあるかご存知でしょうか?
「rendered」プロパティではなく、「loaded」プロパティを使用する
スコープ変数を使うなどして同じ処理を繰り返さない
Render Response フェーズのみで処理を行う