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