Oracle® Fusion Middleware Oracle Application Development Framework Swingアプリケーションの開発 12c (12.1.3) E59440-01 |
|
![]() 前 |
![]() 次 |
この章では、ADF Swingアプリケーションの実行時のパフォーマンスを向上する方法について説明します。最適なパフォーマンスを得るためのデータ同期手法だけでなく、ADF SwingアプリケーションでのADFビジネス・コンポーネント属性のフェッチを制限する手法について説明します。
この章には、次のセクションがあります。
ADF Swingコードでメソッド・コールを行い、クライアントとリモート・デプロイメント・モードのADFビジネス・コンポーネント・ビジネス・サービスとの間のネットワーク・トラフィックを最適化できます。
JDeveloperのデザイン・タイム・ツールで作業しているユーザーは、デフォルトでこの項で説明する最適化を得られます。
ただし、JDeveloperの外部で、ADFビジネス・コンポーネントに対して提供されているAPIを使用してアプリケーションを開発しており、JDeveloperデザイン・タイムを使用してADF Swingクライアントを作成していない場合は、これらの最適化の実行が必要になることがあります。
ADFビジネス・コンポーネント・アプリケーション・モジュールのデータ同期モードをバッチに設定することで、ADFビジネス・コンポーネント・クライアント・アプリケーションからリモートにデプロイされたビジネス・コンポーネントに送信される実行頻度の少ない検証を犠牲にすると、ネットワーク・トラフィックを向上させることができます。バッチ・モードとは、ユーザーによって行われた属性値の変更が、その変更の送信を強制するアクションをユーザーが実行するまでクライアント層に保持されることを意味します。バッチ・モードは、遅延同期モードとも呼ばれ、ネットワーク上のトリップ回数を削減します。その結果、ADFビジネス・コンポーネントによる属性の検証が遅延します。
データ同期は、デフォルトでは"即時"モードであり、変更は行われるとただちに適用され、その結果、属性値は即時に検証されます。
注意: ローカル・モード・デプロイメント(クライアントとADFビジネス・コンポーネントが同じVM上に常駐する)では、同期モードが常に"即時"です。 |
JDeveloper内で、クライアントの同期設定を変更する手順は次のとおりです。
「アプリケーション」ウィンドウで、表示モードを「ディレクトリの表示」に変更し、ユーザー・インタフェース・プロジェクトを開き、DataBindings.cpx
ファイルを選択します。
DataBindings.cpx
ファイルが、ユーザー・インタフェース・プロジェクトのadfmsrc
フォルダに追加されます。
「構造」ウィンドウで、dataControlUsagesを開き、目的のデータ・コントロールを選択します。
「プロパティ」ウィンドウで「その他」セクションを開き、「syncMode」フィールドのドロップダウン・リストから目的の設定を選択します。
アプリケーション・モジュールの同期モードを設定する手順は次のとおりです(JDeveloperデザイン・タイムの外部の場合)。
次にようにApplicationModuleImpl
クラスでsetSyncMode()
をコールします。
yourAm.setSyncMode(ApplicationModule.SYNC_IMMEDIATE);
ネットワークの最適化を犠牲にしてADFビジネス・コンポーネントによる属性検証の制御を最大にする場合は、それをSYNC_IMMEDIATE
に設定できます。たとえば、このモードでは、クライアントによって1人の従業員に10個の属性が設定されている場合、新しい値ごとに検証を提供するために、コードで10個のsetAttribute()
メソッドをコールすることになります。
または
yourAm.setSyncMode(ApplicationModule.SYNC_LAZY);
それをSYNC_LAZY
に設定すると、ネットワーク上のトリップ回数が削減され、アプリケーションを最適化することができます。このモードでは、クライアント側の属性設定要求は、データが変更されたときではなく、次にクライアントがイベントをADFビジネス・コンポーネントに送信するときまでバッファされます。アプリケーション・コードをさらに変更する必要はありません。たとえば、クライアントによって1人の従業員に10個の属性が設定されている場合、コードによってsetAttribute()
メソッドが呼び出されるのは、クライアントが次のことを実行した後のみです。
現在の行を変更する。
postChanges()
またはcommit()
メソッドをコールする。
明示的にsync
メソッドをコールする。
その行に対してvalidate()メソッドをコールする。
ApplicationModuleImpl
を拡張するクラス内である場合は、それによってApplicationModule
インタフェースが実装されるため、単に例10-1に示すコードを追加できます。
例10-1 クラスによってApplicationModuleImplが拡張される場合のコード
ApplicationModule yourAm = panelBinding.getApplication().getApplicationModule(); yourAm.setSyncMode(SYNC_LAZY);
ただし、別のクラス内(たとえば、クライアント・コード内)である場合は、例10-2のように、それが出現するインタフェースでその定数を修飾する必要があります。
例10-2 別のクラス内の場合のコード
ApplicationModule yourAm = panelBinding.getApplication().getApplicationModule(); yourAm.setSyncMode(ApplicationModule.SYNC_LAZY);
ADF Swingブートストラップ・コードで、データ・コントロール・オブジェクトを作成後、ただちにsetSyncMode()
をコールする必要があります。または、getApplication()
をコールし、ADF Swingパネルのコンストラクタで同期モードを設定できます。選択する場所は、同期モードをアプリケーション全体で保持するのか、パネルのレベルで変更するのかによって異なります。
ApplicationModuleに対してプログラムでデータの同期を設定することに決定した場合は、ADFビジネス・コンポーネント・データ・コントロールのsyncModeプロパティ設定で行われる相互作用に注意する必要があります。存在する有効な組合せは次の3つのみです。
am.setSyncMode(SYNC_IMMEDIATE)
+ syncModeプロパティが"バッチ"である。この場合、バッチ・モードになります。すべての更新は、次のam.sync()
まで遅延されます。これは、bindingContainer.refresh()
をコールすることで適切なときにアプリケーションによって呼び出される必要があります。また、更新はRollbackおよびCommitアクションが開始されたときに自動的に行われます。
SYNC_IMMEDIATE
+"Batch"の組合せ。ADF BCプロジェクトを作成する際のJDeveloper 10.1.2以降におけるデフォルトです。これは、JDeveloper 10.1.2以降で3層ADF Swingアプリケーションに対して使用する組合せです。
am.setSyncMode(SYNC_LAZY)
+ syncModeプロパティが"即時"である。この場合、即時モードになり、属性の設定メソッド・コールは、次の行のナビゲーションまで遅延されます。
SYNC_LAZY
+"即時"の組合せは、3層モードでデプロイされていて10.1.2以降にアップグレードされるADF Swing 9.0.5およびそれ以前のアプリケーションに対する設定です。
am.setSyncMode(SYNC_IMMEDIATE)
+ syncModeプロパティが"即時"である。この場合、即時モードになります。
SYNC_IMMEDIATE
+"即時"の組合せは、データベースとの対話レベルが非常に高いアプリケーションや、即時検証が必要な状況に適しています。この場合は、アプリケーションを即時モードで実行し、データが即時に同期化されるようにしてください。ADF Swingアプリケーションに対してはお薦めしません。
JDeveloperのデザイン・タイム・ツールで作業しているユーザーは、デフォルトでこの項で説明する最適化を得られます。
ただし、JDeveloperの外部で、ADFビジネス・コンポーネントに対して提供されているAPIを使用してアプリケーションを開発しており、ビュー・オブジェクト・メタデータ(XMLファイル)を作成しない場合は、これらの最適化の実行が必要になることがあります。
クライアントが使用するビュー・オブジェクト属性のリストを指定することで、ADFビジネス・コンポーネント・クライアント・アプリケーションおよびリモートにデプロイされているビジネス・コンポーネントの起動時間を最適化できます。APIにコーディングすることでメタデータなしでプロジェクトを作成する場合、フォームによって使用される属性のみのリストでfetchAttributeProperties()
をクライアント・フォームのブートストラップ・コードに追加します。このメソッド・コールがない場合、クライアント・フォームは、1回のネットワーク・ラウンドトリップで、アプリケーション・モジュールで指定されているビュー・オブジェクトのすべての属性のすべてのコントロール・ヒント・プロパティ(たとえば、属性の書式やラベルなど)がフェッチされます。
たとえば、ADF Swingフォームのバインドされたビュー・オブジェクトの一部の属性を使用しない場合、fetchAttributeProperties()
メソッドで、ADF Swingフォームは、フォームのレイアウトに必要な情報のみをフェッチし、不要な属性は無視します。
注意: ローカル・モード・デプロイメント(クライアントとADFビジネス・コンポーネントが同じVM上に常駐する)では、属性プロパティのフェッチはサポートされていません。 |
属性プロパティの取得を最短時間にする手順は次のとおりです(JDeveloperデザイン・タイムの外部の場合)。
ApplicationModule
でfetchAttributeProperties()
をコールします。
このメソッドは、引数として、ビュー・オブジェクト名のリストと、ビュー・オブジェクトごとの属性名のリストを取ります。リストには、属性がすべて含まれていることも一部のみが含まれていることもあります。フォームで、ビュー・オブジェクトのすべての属性が必要とされている場合、属性引数としてnull
を指定できます。この場合、フォームでビュー・オブジェクトのすべての属性が使用されるため、起動時間が大幅に短縮されないこともあります。
注意: ADF Swingフォームまたはパネルのウィザードを使用して、完全なフォームを生成する場合、 |
例10-3に示すように、ADF Swingブートストラップ・コードで、データ・コントロール・オブジェクトを作成後、ただちにfetchAttributeProperties()
をコールする必要があります。次の例では、最初のビュー・オブジェクトの3個の属性のカスタム・プロパティおよび2番目のビュー・オブジェクトの5個の属性がダウンロードされます。
例10-3 ADF Swingブートストラップ・コードにおけるfetchAttributePropertiesのコール
// bootstrap application JUMetaObjectManager.setBaseErrorHandler(new JUErrorHandlerDlg()); JUMetaObjectManager mgr = JUMetaObjectManager.getJUMom(); mgr.setADF SwingDefFactory(null); BindingContext ctx = new BindingContext(); ctx.put(DataControlFactory.APP_PARAM_ENV_INFO, new JUEnvInfoProvider()); ctx.setLocaleContext(new DefLocaleContext(null)); HashMap map = new HashMap(4); map.put(DataControlFactory.APP_PARAMS_BINDING_CONTEXT, ctx); mgr.loadCpx("DataBindings.cpx", map); DCDataControl app = (DCDataControl)ctx.get("model_AppModuleDataControl"); app.setClientApp(DCDataControl.JCLIENT); app.getApplicationModule().fetchAttributeProperties(new String[] {"VO1", "VO2"}, new String[][] { {"VO1Attr1", "VO1Attr2", "VO1Attr3"}, {"VO2Attr1", "VO2Attr2", "VO2Attr3", "VO2Attr4", "VO2Attr5"} }, null); ...
fetchAttributeProperties()
をコールすることで、getFormat()
やgetLabel()
などのプロパティ・メソッドが、フォームが作成されるたびにADFビジネス・コンポーネント属性定義に対してコールされることを防止できます。