ヘッダーをスキップ

Oracle Application Server パフォーマンス・ガイド
10gリリース3(10.1.3.1.0)

B31836-02
目次
目次
索引
索引

戻る 次へ

4 その他のパフォーマンス分野

この章には、Oracle Application Serverの次の分野のパフォーマンス情報が含まれています。

4.1 TopLinkパフォーマンスの向上

Oracle TopLink(TopLink)には、アプリケーションのパフォーマンスを最適化するための機能があります。そのうち、重要な分野は次のとおりです。

TopLinkのドキュメントには、これらの重要なTopLinkのパフォーマンス分野に関する情報が含まれています。TopLinkのパフォーマンスを最適化するためのアプリケーションをチューニングする方法の詳細は、ドキュメントの該当する章を参照してください。

関連項目

  • 『Oracle TopLink開発者ガイド』の第11章「最適化」

  • 『Oracle TopLink開発者ガイド』の第90章「キャッシュの概要」

  • 『Oracle TopLink開発者ガイド』の第96章「TopLink問合せの概要」

 

4.2 JTAパフォーマンスの向上

この項では、JTAのパフォーマンス・オプションについて説明します。この項には、次の項目が含まれています。

4.2.1 パフォーマンス向上を目的とした2フェーズ・コミット・ロギングの構成

構成オプションを使用することで、2フェーズ・コミット・ロギングのタイプとレベルを制御できます。構成オプションを変更するには、transaction-manager.xmlファイルを変更するか、またはJTAリソースのMBeanを使用します。このMBeanは、Application Server Controlコンソールの「トランザクション・マネージャ」ページで利用できます。2フェーズ・コミット・ロギングを構成する場合は、2フェーズ・コミット・ロギングをオフにしたときのトランザクションへの波及効果を認識しておく必要があります。


注意

2フェーズ・コミット・ロギングは、デフォルトでオフに設定されています。デフォルトのロギング・レベルを使用すると、JTAリソースでは、リカバリおよび完全なACIDプロパティがサポートされません。 


表4-1に、2フェーズ・コミット・ロギングの構成オプションを示します。これらのオプションは、transaction-manager.xmlで設定するか、またはJTAリソースのMBeanを使用して設定できます。

表4-1    2フェーズ・コミット・ロギングのログ・タイプ構成オプション 
ログ・タイプ  説明  パフォーマンス上の注意 

none 

ロギング(またはリカバリ)なし。

これはデフォルト値です。 

リカバリおよびACIDプロパティが不要の場合は、このオプションを指定することで最高のパフォーマンスが得られます。 

file 

ファイル・ロギングでは、トランザクションのリカバリ用に、ファイル・システムへのロギングを指定します。  

通常、ファイル・ロギングはデータベース・ロギングより、オーバーヘッドが低くなるためパフォーマンスがよくなります。 

database 

データベース・ロギングでは、トランザクションのリカバリ用に、Oracleデータベースへのロギングを指定します。  

通常、ファイル・ロギングのほうがデータベース・ロギングよりパフォーマンスがよくなります。 


関連項目

2フェーズ・コミット・ロギングの構成オプションの詳細、およびそれぞれのログ・タイプ構成オプションによるトランザクションおよびリカバリへの波及効果の詳細は、『Oracle Containers for J2EEサービス・ガイド』を参照してください。 


4.2.1.1 JTAストアのファイル・ロギング・オプションの設定

表4-2で、ファイル・ストア・ロギングのパフォーマンス設定について説明します。これらの設定はtransaction-manager.xmlで指定するか、またはJTAリソースのMBeanを使用して指定できます。2フェーズ・コミット・トランザクションの最大同時実行数が256より少ない場合は、デフォルト設定が適しています。

2フェーズ・コミット・トランザクションの最大同時実行数を判定するには、JTAResourceメトリック表のTwoPhaseCommitCompletion.maxActiveメトリックを使用します。

関連項目

JTAリソースのメトリックの詳細は、表D-1を参照してください。 

表4-2    JTAファイル・ストア・ロギングのパラメータ 
パラメータ  説明  パフォーマンス上の注意 

maxOpenFiles 

オープンまたはアクティブな状態を維持できるファイル記述子の最大数。この数を超えると、xidが再びリクエストされるまで、最も古いファイル記述子が解放されます。

maxOpenFilesの値は、できるだけ超えないようにしてください。

デフォルト値: 256 

最適な値は、2フェーズ・コミット・トランザクションを使用する最大同時リクエスト数(プラス、リカバリ用に必要になる可能性がある少数の追加ファイル数)に対応できる大きさの数値です。

maxOpenFilesの値は、オペレーティング・システムのオープン・ファイル記述子の上限によって制限されます。 

minPoolSize 

起動時にプールに事前に割り当てられるファイル数。

デフォルト値: 40 

最適な値は、2フェーズ・コミットの最大同時リクエスト数を処理できる大きさの数値です。

注意: 最大同時実行数が大きい場合、起動時のコストが高くならないように、デフォルト値よりは大きくてもmaxOpenFilesの値よりは小さい値に設定します。 

oldFileReleaseSize 

maxOpenFilesを超えたときに閉じる、最も古いファイル・ハンドルの数。

デフォルト値: 20 

本来は好ましくないことですが、maxOpenFilesの値を繰返し超えることが予想される場合は、oldFileReleaseSizeの値を大きくして、解放するファイル・ハンドルの数を増やすことで、maxOpenFilesを超える回数を減らすことができます。 


注意

maxOpenFilesに指定した数値で、トランザクションの数が制限されることはありません。maxOpenFilesを超えると、古いファイル・ハンドルが解放されますが、新しいトランザクションは引き続き作成できます(oldFileReleaseSizeパラメータを参照)。 


4.2.2 パフォーマンス向上を目的としたJTAデータソースの構成

この項には、次の項目が含まれています。

4.2.2.1 データソースのタイプの指定

一般的に、XAに準拠していないデータソースは、XAデータソースより高速です。XAに準拠した完全な2フェーズ・コミットが必要な場合は、XAデータソースを使用する必要があります。

トランザクションのロギングがnoneに設定されている場合は、XA準拠または非準拠のリソースを、グローバル・トランザクションでいくつでも確保できます。ただしこの場合、ACIDの保証にもリカバリにも対応しません。

トランザクションのロギングが有効になっている場合は、グローバル・トランザクションに組み込むリソースはXAに準拠していることが必要です。最終リソース・コミット機能を使用すると、XAに準拠していない単一のリソースを、XAトランザクションに組み込むことができます。

関連項目

『Oracle Containers for J2EEサービス・ガイド』 

4.2.2.2 最終リソース・コミットの使用

最終リソース・コミットは、XAに準拠していないリソースをグローバル・トランザクションに組み込めるだけでなく、パフォーマンスの最適化を図るために使用することもできます。XA対応リソースを非XAリソースとして確保して最終リソース・コミットを使用すると、そのリソースがXAロギングを実行する必要がないため、パフォーマンスが向上します。また、そのリソースはインダウト状態、つまり準備状態には決してならないため、リソースのロックが発生しません。最終リソース・コミットは、パフォーマンスの最適化を図るために使用できますが、そのかわり正確性は保証されなくなります。

関連項目

『Oracle Containers for J2EEサービス・ガイド』 

4.2.2.3 単一のデータソースの使用(可能な場合)

単一のリソースへのアクセスにアプリケーションが複数のデータソースを使用すると、(XAトランザクションを使った)2フェーズ・コミット操作が、意図せずに使用される可能性があります。一部のケースでは、構成を変更することでパフォーマンスが向上することがあります。この構成変更により、OC4Jは2フェーズ・コミットでなく1フェーズ・コミットを使用するようになります。

次のメトリックを使用すると、1フェーズ・コミット数と2フェーズ・コミット数、およびリソースの確保を行わないグローバル・トランザクションの件数を確認できます。

/oc4j/JTA/SinglePhaseCommitCompletion.completed
/oc4j/JTA/TwoPhaseCommitCompletion.completed
/oc4j/JTA/AverageCommitTime.completed

注意

/oc4j/JTA/AverageCommitTime.completedメトリックでは、JTA関連のトランザクションがすべて示されますが、ローカル・トランザクションは示されません。 

同じグローバル・トランザクション内に複数のデータソースが存在する場合は必ず、それらのデータソースが実際には同じデータベースを指していたとしても、XAの2フェーズ・コミット・トランザクションが使用されます。アプリケーションで使用するデータソースが単一のデータベースおよびスキーマにデプロイされている場合は、単一のデータソースを使用するようにアプリケーションを再構成することができます。これにより、2フェーズ・コミットが1フェーズ・コミットに変更され、パフォーマンスが向上します。

このように、表など従来型のデータベース・リソースを使用し、リソースが同じデータベースに存在している場合にOJMSを使用するトランザクション型アプリケーションは、リソースごとに単一のデータソースを指定することにより、一部の2フェーズ・コミットを回避できます。この変更によってパフォーマンスが向上しますが、この場合、OJMSデータソースの構成が、表へのアクセスに対して指定された構成と一致している必要があります。

関連項目

ローカル・トランザクションとグローバル・トランザクションの詳細は、『Oracle Containers for J2EEサービス・ガイド』を参照してください。 

4.2.3 JTAリソースの監視

JTAリソースを監視する際には、エラーによってパフォーマンス上の問題が発生する可能性があることに注意してください。JTAエラーがあるかどうかを調べるには、JTAResourceメトリック表のメトリックを使用して、ロールバックと例外の件数に0より大きい数値がないかを調べます。たとえば、RollbackExceptionCountRolledbackCountSystemExceptionCountの各メトリックの値を調べます。

また、一部のパフォーマンス上の問題からJTAエラーが発生することもあります。たとえば、パフォーマンスが悪い場合に、タイムアウト・エラーが発生することがあります。この場合は、メトリックRolledbackDueToTimedOutCountの値を調べます。

関連項目

「JTAリソースのメトリック」表D-1 

4.3 EJBパフォーマンスの向上

この項では、次の項目について説明します。

4.3.1 MDBパフォーマンスの向上

この項では、orion-ejb-jar.xml構成ファイルで指定され、メッセージドリブンBean(MDB)に適用される、パフォーマンスに関連する重要なEJB構成プロパティのいくつかについて説明します。内容は次のとおりです。

4.3.1.1 JMSコネクタのレシーバ・スレッドの設定

MDBのキューにメッセージを送信する多数の同時ユーザーがいる場合やonMessageメソッドで大量の処理が発生する場合、MDBに対してJMSコネクタのレシーバ・スレッド数を設定すると、パフォーマンスを向上させることができます。たとえば、onMessageメソッドに別のEJBをコールするコードが含まれていて、他のメッセージの処理中にEJB処理が同時に発生する場合、JMSコネクタのレシーバ・スレッドを1より大きい値に設定するとパフォーマンスが向上します。基礎となるJMSコネクタおよび特定のMDBによっては、JMSコネクタのReceiverThreads構成プロパティの値を増やすと、パフォーマンスが大幅に向上するアプリケーションもあります。

たとえば、キューに100個のメッセージが含まれていて、ReceiverThreadsがデフォルト値の1に設定されている場合、メッセージは順番に1つのMDBのレシーバ・スレッド・プロセスによってのみ処理されます。ReceiverThreadsを5に設定すると、最大で5個のMDBインスタンスがキューからメッセージを取得でき、メッセージをパラレル処理できることが指定されます。この例では、OC4Jはメッセージのデキューと処理に最大5個のMDBスレッドを使用するので、100個のメッセージの処理の完了に必要な合計時間は短くなります。


注意

JMSコネクタのReceiverThreads値では、スレッドの最大値が指定されます。そのため、負荷によっては、一部のスレッドが使用されないこともあります。 


JMSコネクタのReceiverThreadsの値を1より大きい値に設定すると、MDBの複数のインスタンスによって、キューのメッセージを同時に処理できるようになります。ただし、この場合、パフォーマンスの向上は、アプリケーションおよび指定したスレッドの数によって異なります。指定した値が大きすぎると、リソースの競合によってパフォーマンスが低下することがあります。


注意

JMSトピックに関しては、JMSコネクタのReceiverThreads構成プロパティは常に、値1に設定してください(1より大きい値が有効に機能するのは、キューのみです)。 


4.3.1.1.1 MDBのメッセージ処理順序に関する要件の考慮

メッセージを順番に処理する必要がある場合は、値が1に設定されたJMSコネクタのReceiverThreadsを使用します。1より大きい値を設定したReceiverThreadsを使用した場合、メッセージはキューから逐次削除されますが、MDBでは複数のスレッドでメッセージが処理されるのでメッセージを処理する順序は保証されません。

4.3.1.1.2 スレッド・プールの設定とBeanインスタンスの設定の調整

OC4Jは、JMSコネクタのレシーバ・スレッドとして使用されるスレッドを作業マネージャのスレッド・プール(Application Server Controlコンソールおよびserver.xmlでjcaスレッド・プールとして示される)から割り当てます。JMSコネクタのレシーバ・スレッド数は、作業マネージャのスレッド・プールで、jcaスレッド・プールのmaxパラメータを使用して制限できます。また、minの値を使用して、作業マネージャのスレッド・プールの利用可能なスレッドの初期数を設定することもできます。


パフォーマンス上の注意

jca作業マネージャのスレッド・プールはデフォルト設定のままにすることをお薦めします。そのため、EJB MDBの同時実行数を制御する場合は、JMSコネクタのReceiverThreadsの値を使用します。 


JMSコネクタのReceiverThreadsの値を設定するときには、次の構成オプションを調整する必要があります。

4.3.1.1.3 JMSコネクタのレシーバ・スレッド設定時におけるデータベース接続の考慮

MDBでデータベース接続が必要な場合は、JMSコネクタのReceiverThreadsの数によって、必要なデータベース接続の数も乗算されます。たとえば、あるMDBで5つのデータベース接続が同時に使用され、アクティブなMDBインスタンスが5つある場合、要求されるデータベース同時接続数は25になります。このように、データソースmax-connectionsの件数の計算には、JMSコネクタのReceiverThreadsの数を組み込む必要があります。

関連項目

「データベース接続の再利用」 

4.3.1.2 ejbCreateメソッドを使用した1回かぎりの初期化

MDBは、ステートレスで、複数の起動にわたって特定のクライアントの状態を保持することはありません。ただし、クライアント関連以外の状態については、MDBインスタンスは、複数のクライアント・メッセージの処理の間、状態を保持できます。たとえば、ルックアップの状態を保持できます。さらに、EJBへの参照など、onMessageの複数の起動にわたってキャッシュする必要があるその他の状態情報は、ejbCreateメソッドで初期化されてキャッシュされ、MDBのパフォーマンスが最適になります。

アイドル状態のMDBオブジェクトがプールから削除され、必要に応じて再割当てされる場合は、ejbRemoveメソッドで、状態を忘れずに破棄してください。

4.3.1.3 MDBリソースの監視

MDBでOracleAS JMSがメッセージ・プロバイダとして使用される場合、Oracle Application Serverパフォーマンス監視ツールからDMSメッセージ関連のメトリックを使用できます。

たとえば、OracleAS JMS JMSStoreStatsメトリック表には、MDBによって使用されるキューに対応する宛先の情報が含まれています。

destination.value:        name
messageDequeued.count:    x ops
messageEnqueued.count:    x ops
messageCount.value:  n

これらのメトリックには、宛先名、エンキューされた合計メッセージ数、デキューされた合計メッセージ数、およびキュー内の現在の合計数が表示されます。

また、MDBのonMessageメトリックを調べて、onMessageの時間が予想どおりの長さになっているかを確認したり、maxActiveメトリックを使用して、同時実行されるレシーバ・スレッドの合計数が予想どおりの数になっているかを確認することもできます。

client.active:   1   threads
client.avg:   112   msecs
client.completed:   4   ops
client.maxActive:        1       threads
client.maxTime:  70       msecs
client.minTime:  130      msecs
client.time:     121      msecs


注意

JMS宛先を監視する場合、MDB以外のアプリケーションもその宛先にアクセスできます。したがって、アプリケーションのパフォーマンスをテストする場合は、そのアプリケーションがメトリックでレポートされるメッセージ・アクティビティを行っているかどうかを確認してください。 


Application Server Controlコンソールには、すべてのMDBと個々のMDBのパフォーマンスに関する情報が表示されます。

MDBのサマリー情報にアクセスするには、次の手順を実行します。

  1. OC4Jホーム・ページから、「管理」サブタブを選択します。

  2. 表の「サービス」で、「JMSプロバイダ」タスクを選択します。

  3. Application Server Controlコンソールの「パフォーマンス」領域に、次のサマリー情報が表示されます。

    Active Connections
    Messages Waiting for Read
    Messages Waiting for Commit
    Messages Enqueued per Second
    Messages Dequeued per Second
    Messages Paged In per Second
    Messages Paged Out per Second
    Messages Committed Since Startup
    Messages Rolled Back Since Startup
    Messages Expired Since Startup
    
    

個々のMDBの情報にアクセスにするには、Application Server Controlコンソールのパフォーマンス領域を使用します。

  1. OC4Jホーム・ページから、「アプリケーション」サブタブを選択します。

  2. 監視するアプリケーションを選択します。

  3. モジュール」表で、該当するEJBモジュールを選択します。

  4. メッセージドリブンBean」領域で、監視するMDBを選択します。次の情報が表示されます。

    Messages Dequeued   
    Messages Rolled Back   
    Average Message Processing Time (seconds)  
    Number of Available Instances  
    Number of Used Instances  
    
    

    関連項目

    「OC4J JMSメトリック」 

4.3.2 EJB CMP 2.1パフォーマンスの向上

この項では、CMPを使用するエンティティBeanで利用できるいくつかのパフォーマンス・オプションについて説明します。次の項目が含まれます。

4.3.2.1 効率的なSQL文とSQL問合せの使用

この項では、効率的なSQL文とSQL問合せの使用について説明します。表4-3表4-4に、SQL文およびSQL問合せに関連するチューニング・パラメータとパフォーマンス推奨事項を示します。

表4-3    効率的なSQL文とSQL問合せを使用したCMP EJB 
チューニング・パラメータ  説明  パフォーマンス上の注意 

パラメータ化されたSQLバインディング 

パラメータ化されたSQLと準備された文キャッシュを使用すると、頻繁にコールされる問合せに対してデータベースのSQLエンジンがSQLの解析と準備を行う回数が減るため、パフォーマンスが向上することがあります。データベースとJDBCドライバのなかには、パラメータ化されたSQLと準備された文キャッシュをサポートしていないものもあるため、TopLinkとOC4J/CMPでは、これらのオプションがデフォルトでは有効になっていません。OC4JにバンドルされているOracle JDBCドライバは、これらのオプションをサポートしていません。

デフォルト値: オフ

関連項目: 『Oracle TopLink開発者ガイド』の、名前を付けた問合せ、パラメータ化されたSQLおよび文キャッシュのプロジェクト・レベルでの構成に関する項 

すべての問合せに対して、(プロジェクト・レベルで)SQLパラメータのバインディングをオンにします。パラメータ化されたSQLと準備された文キャッシュをサポートするデータベースとJDBCドライバを選択し、それに対してこれらのオプションを有効化することをお薦めします。 

JDBC文キャッシュ

 

カーソルを繰返し作成したり、文を繰り返し解析および作成することに起因するオーバーヘッドを軽減するために、文キャッシュを使用することで、データベースを使用するアプリケーションのパフォーマンスを向上させることができます。

注意: データソースの文キャッシュを使用してください(CMPにはTopLinkの文キャッシュは使用しないでください)。

デフォルト値: オフ

関連項目: 『Oracle Containers for J2EEサービス・ガイド』の「マネージド・データソースでの文キャッシュ」 

使用しているJDBCドライバが文キャッシュをサポートしている場合は、必ずそのオプションを有効化してください。Oracle JDBCドライバは、このオプションをサポートしています。このオプションを設定するには、data-sources.xmlnum-cached-statementsを設定します。 

フェッチ・サイズ

 

JDBCフェッチ・サイズは、追加の行が必要な場合にデータベースからフェッチする行数に関して、JDBCドライバにヒントを提供します。多数のオブジェクトを返す大きな問合せに対しては、問合せに使用する行フェッチ・サイズを構成し、選択条件を満たすために必要なデータベースのヒット件数を減らして、パフォーマンスを高めることができます。

ほとんどのJDBCドライバは、デフォルトのフェッチ・サイズである10を使用します。1000個のオブジェクトを読み取る場合、フェッチ・サイズを256に増やすと、問合せ結果のフェッチ所要時間を大幅に短縮できます。

注意: デフォルト値は、JDBCドライバのデフォルト値を使用することを意味します。Oracle JDBCドライバの場合、このデフォルト値は通常10行です。

デフォルト値: 0

関連項目: 『Oracle TopLink開発者ガイド』 

最適のフェッチ・サイズは、常に明らかなわけではありません。通常、最適なフェッチ・サイズは、予想される合計結果サイズの1/2または1/4です。結果セットのサイズが不明な場合に、設定したフェッチ・サイズが大きすぎたり小さすぎたりすると、パフォーマンスが低下することがあるので注意してください。

 

バッチ書込み 

バッチ書込みでは、INSERT文、UPDATE文およびDELETE文のグループが、個別にではなく単一のトランザクションで一括してデーベースに送られるため、データベースのパフォーマンスを向上させることができます。

デフォルト値: オフ

関連項目: 『Oracle TopLink開発者ガイド』の、データ・アクセスの最適化に関する項 

すべてのEJBに対して有効化します。 

4.3.2.1.1 コンテナ管理の関連性の問合せのパフォーマンスのチューニング

表4-4に、パフォーマンスのチューニングのためのCMRパラメータを示します。

表4-4    CMP EJBおよびCMRの問合せのパフォーマンス・オプション 
チューニング・パラメータ  説明  パフォーマンス上の注意 

バッチ読取り 

バッチ読取りでは、問合せの選択条件がオブジェクトの関連属性のマッピングによって伝播されます。また、複合的なオブジェクト・グラフによって、バッチ読取り操作をネストすることもできます。それにより、必要なSQL SELECT文の数が大幅に減り、データベースへのアクセスの効率が向上します。

デフォルト値: オフ

関連項目: 『Oracle TopLink開発者ガイド』の、バッチ読取りに関する項 

同じく取得が必要な表データに列マッピングされた表の問合せに使用します。

データのすべてにアクセスすることがわかっている場合は、バッチ読取りと結合のいずれか一方のみを使用してください。関係にアクセスしない場合は、インダイレクションによってロードが遅延する状態のままにしてください。

バッチ読取りは、1対mなどの関係に対しては、データベースから読み取るデータが少なくなるため(n*mに対してnで済むため)、効率が上がります。また、m対1の論理関係でも、データの読取りが減るため効率が上がります。バッチ読取りは、キャッシュを併用すると、パフォーマンスがさらによくなります。これは、元のオブジェクトとその関係がすでにキャッシュされている場合、バッチ問合せの実行が不要になるためです(この場合、結合ですべてのデータがすでに読み込まれていると想定されます)。 TopLinkでは、ほとんどのマッピング(1対1、1対m、m対m、dc、ac)に対して、問合せおよびマッピングのレベルでのバッチ読取りをサポートしています。 

結合 

結合読取りは問合せ最適化機能の1つで、これを使用すると、1つのクラスの単一問合せでデータを戻し、そのクラスのインスタンスとその関連オブジェクトを構築することができます。この機能を使用すると、データベースへのアクセスが減るため、問合せのパフォーマンスが向上します。デフォルトでは、関係は結合読取りされません。各関係は、インダイレクションを使用している場合はアクセス時に個別にフェッチされ、インダイレクションを使用していない場合は個別のデータベース問合せとしてフェッチされます。

デフォルト値: 使用しない

関連項目: 『Oracle TopLink開発者ガイド』の、結合読取りの使用に関する項 

同じく取得が必要な表データに列マッピングされた表の問合せに使用します。

データのすべてにアクセスすることがわかっている場合は、バッチ読取りと結合のいずれか一方のみを使用してください。関係にアクセスしない場合は、インダイレクションによってロードが遅延する状態のままにしてください。

TopLinkでは、問合せレベルでは1対1と1対mの結合のみ、マッピング・レベルでは1対1(内部)の結合のみをサポートしています。パフォーマンスの面では、結合は1対1の論理関係の場合にのみお薦めします。

継承を使用し、複数の表にまたがるサブクラスを持つ関連クラスに対しては、結合はサポートされていません。 

インダイレクション 

インダイレクションがオンになっていないと、TopLinkは、永続オブジェクトの取得時に、その永続オブジェクトが参照する依存オブジェクトをすべて取得します。関係マッピングによってマッピングされた属性に対してインダイレクション(遅延読取り、遅延ロード、Just-in-Time読取りともいう)を構成すると、TopLinkはインダイレクション・オブジェクトを参照オブジェクトのプレースホルダとして使用します。依存オブジェクトの読取りは、その属性自体にアクセスするまで延期されます。その結果、パフォーマンスが大幅に向上することがあります。特に、アプリケーションが必要としているものが取得したオブジェクトの内容のみに限られ、そのオブジェクトの関連オブジェクトが不要な場合に効果があります。

デフォルト値: すべてのCMRに対するバリュー・ホルダのインダイレクションがオン

関連項目: 『Oracle TopLink開発者ガイド』のインダイレクションに関する項 

インダイレクション・オプションは、デフォルト値のままにしておきます。つまり、あらゆる状況でCMPに対してインダイレクションを使用します。結合読取りやバッチ読取りを使用して参照オブジェクトの問合せを実行すると、さらに効率が上がります。 

4.3.2.2 キャッシュ構成のパフォーマンスのチューニング

表4-5に、キャッシュ構成オプションを示します。

表4-5    CMP EJBおよびキャッシュ構成オプション 
チューニング・パラメータ  説明  パフォーマンス上の注意 

オブジェクト・キャッシュ 

TopLinkセッションには、オブジェクト・キャッシュが用意されています。TopLink永続性マネージャを使用するCMP 2.1アプリケーションがTopLinkセッションを作成し、そのセッションはデフォルトでこのキャッシュを使用します。セッション・キャッシュと呼ばれるこのキャッシュには、データベースとの間で読み書きされたオブジェクトの情報が格納されます。セッション・キャッシュはTopLinkアプリケーションのパフォーマンスを向上させるための重要な要素の1つです。通常、サーバー・セッションのオブジェクト・キャッシュは、そのセッションから取得されたすべてのクライアント・セッションで共有されます。分離セッションは、共有オブジェクト・キャッシュから分離された固有のセッション・キャッシュを備えています。

デフォルト値: 有効

関連項目: 『Oracle TopLink開発者ガイド』の、オブジェクト・キャッシュに関する項 

即時問合せに対しては無効にします(分離キャッシュを使用)。 

問合せ結果セット・キャッシュ 

TopLinkでは、TopLinkのオブジェクト・キャッシュに加えて、問合せキャッシュもサポートしています。

  • オブジェクト・キャッシュでは、主キーによってオブジェクトの索引が作成されるため、主キーの問合せでキャッシュ・ヒットを取得できます。オブジェクト・キャッシュを使用することで、データソースにアクセスする問合せで、該当するオブジェクトがすでに存在する場合に、オブジェクトとその関係を構築するコストが不要になります。

  • 問合せキャッシュは、オブジェクト・キャッシュとは区別されます。問合せキャッシュの索引は、オブジェクトの主キーではなく、問合せと問合せパラメータによって作成されます。そのため、同じパラメータで実行されたあらゆる問合せで、問合せキャッシュ・ヒットを取得し、同じ結果セットを戻すことができます。

デフォルト値: 使用しない

関連項目: 『Oracle TopLink開発者ガイド』の、問合せ結果のセッション・キャッシュへのキャッシングに関する項 

主キー以外のキーで頻繁に実行される問合せのうち、結果セットがめったに変わらないものに使用します。

キャッシュ検証タイムアウトとともに使用し、必要に応じてリフレッシュします。 

キャッシュ・サイズ 

デフォルト値: SoftCacheWeakIdentityMap サイズ100(EJBあたり)

関連項目: 『Oracle TopLink開発者ガイド』の、キャッシュおよびアイデンティティ・マップの構成のガイドラインに関する項 

キャッシュ・サイズは、1つのトランザクション内で参照される(同タイプの)オブジェクトの最大数を格納できる大きさに設定します。 

ロック 

表4-6に示すロック方針がサポートされています。

デフォルト値: ロックなし

関連項目: 『Oracle TopLink開発者ガイド』の、ロック方針の構成に関する項と記述子およびロックの概要に関する項 

 

キャッシュ使用 

キャッシュ使用一致を使用すると、セッション・キャッシュはチェックされません。全読取りの場合、まずデータデースをチェックし、その後、作業ユニットの変更と新規オブジェクトおよび削除されたオブジェクトに結果を一致させます。オブジェクト読取りの場合、まず作業ユニットの変更と新規オブジェクトをチェックして一致するオブジェクトがないかどうかを確認し、その後、データベースをチェックして、変更と削除されたオブジェクトに結果を一致させます。

一致機能は、CheckCacheThenDatabaseよりもPOJOのデフォルト・オプションであるCheckCacheByPrimaryKeyに似ていますが、オブジェクト読取り問合せの場合はCheckCacheThenDatabaseにも似ているところがあります。作業ユニットの変更、新規オブジェクトおよび削除されたオブジェクトに問合せ結果を一致させる必要があることから、一致を使用すると追加のオーバーヘッドが発生します。

CMPの場合、デフォルトはConformResultsInUnitofWorkです。一致処理を行わないようにするには、通常、このデフォルト値をCheckCacheByPrimaryKeyに変更します。全読取り問合せの場合、これは基本的にDoNotCheckCacheと同じ意味です。

デフォルト: ConformResultsInUnitofWork 

コミットされていないデータをトランザクションに読み取らせる必要がない場合、特に読取り専用操作では、各記述子、および不要な場合は問合せレベルで、キャッシュ使用一致をオフにします。 

分離 

TopLinkを使用するCMPアプリケーションには、特定のデータベース・トランザクションの分離レベルを単独で設定するチューニング・パラメータはありません。一般的なCMPアプリケーションでは、データベース・トランザクションの分離レベルが適用されるとき、また特定のデータベース・トランザクションを分離できる程度には、次のような様々な要素が影響します。

  • ロック・モード

  • セッション・キャッシュの使用

  • 外部アプリケーション

  • データベース・ログイン・メソッドsetTransactionIsolation

関連項目: 『Oracle TopLink開発者ガイド』の、データベース・トランザクションの分離レベルに関する項 

 

キャッシュのリフレッシュ 

デフォルトでは、TopLinkはデータソースから読み取ったオブジェクトをキャッシュします。これらのオブジェクトに対する後続の問合せでは、キャッシュへのアクセスが行われます。その結果、データソースへのアクセスが減り、オブジェクトとその関係を再構築するコストが不要になるため、パフォーマンスが向上します。全読取り問合せなどの問合せでデータソースにアクセスした場合も、返されたレコードに対応するオブジェクトがキャッシュに存在すれば、キャッシュ内のオブジェクトが使用されます。このデフォルトのキャッシング方針は、失効したデータをアプリケーションにもたらす場合があります。

リフレッシュは、記述子レベル(alwaysRefreshCache)と問合せレベル(refreshIdentityMapResult)で有効化できます。記述子レベルで設定した場合、(disableCacheHits)も設定しないと、プライマリ・オブジェクト読取り問合せではキャッシュ・ヒットが取得されます。

失効したデータや競合するデータがデータベースにコミットされないようにするには、適切なロック方針を使用するしか方法がありません。キャッシュでのデータのリフレッシュに関して、考慮すべきケースがいくつかあります。これらのケースはいずれも、パフォーマンスに影響を及ぼします。

  • キャッシュされたデータではなく最新データが常に必要な場合は、分離キャッシュを使用することをお薦めします。これは、アプリケーション内の特定のデータが頻繁に変更されるため、競合が検出されたときにだけデータをリフレッシュするのではなく、常にデータをリフレッシュすることが好ましいというような場合です。

  • 失効したデータは使用したくないが、失効データの取得が大した問題でない場合は、解決策としてcache-invalidation方針を使用することをお薦めします。この場合は、コミット時ロックも使用する必要があります。また通常は、ロック・エラーの発生時に失効オブジェクトをリフレッシュするメソッドが必要になります。この場合、findAndRefreshByPrimaryKeyなど、オブジェクトを強制リフレッシュするように(refreshIdentityMapResult)を設定したfinderを定義する必要があります。コミット時ロックを使用する場合は、さらにalwaysRefreshCacheonlyRefreshCacheIfNewerVersionを有効にすると、データベースにアクセスする問合せで、返された失効データをリフレッシュできるとともに、無効オブジェクトが変更されていない場合はリフレッシュしないようにできます。また、リフレッシュされたデータが必要であることがわかっている場合に、特定のfinder操作に対してリフレッシュを有効にしたり、クライアントから取得したデータをリフレッシュするオプション(リフレッシュを実行するfinderをコールするもの)を提供したりすることもできます。

  • データが失効していても問題ない場合。

    この場合は、コミット時ロックを使用する必要があります。また、ロック・エラーの発生時に失効オブジェクトをリフレッシュする操作をコミットするエラー・ハンドラを記述することも必要になります。

デフォルト: キャッシュのリフレッシュなし

関連項目: 『Oracle TopLink開発者ガイド』の、キャッシュのリフレッシュの構成に関する項 

記述子レベルでのキャッシュのリフレッシュはできるだけ避け、かわりに次の構成を検討してください。

  • 問合せごとのキャッシュのリフレッシュ

  • キャッシュの有効期限

  • 分離キャッシュ

 


注意

デフォルトでは、TopLinkは、アプリケーションがそのアプリケーションで使用しているデータに排他アクセスしている(つまり、TopLink以外にデータを変更する外部アプリケーションは存在しない)と想定しています。アプリケーションがデータに排他アクセスしていない場合は、表4-5のデフォルト設定を一部変更する必要があります。 


TopLink永続性マネージャおよびキャッシュとともに使用されるCMP2.1のデフォルト設定は、ロックなし、キャッシュのリフレッシュなし、キャッシュ使用一致なしです。排他アクセスができないときに、アプリケーションがキャッシュから失効データを読み取らないようにし、必要なデータ整合性レベルを維持するには、分離レベルに関連するこれらの設定や他の設定を適切に構成する必要があります。

表4-6に示すロック・モードを、TopLinkのキャッシュ使用オプションおよび問合せリフレッシュ・オプションとともに使用すると、CMPを使用するEJBエンティティBeanのデータ整合性が保証されます。組合せは機能およびパフォーマンスの両方に関連していますが、通常はパフォーマンスよりも最新データとデータ整合性のための機能上の要件を優先して、これらのオプションの設定を決定します。

表4-6    ロック方針 
ロック・オプション  説明  パフォーマンス上の注意 

ロックなし 

ユーザーは、別のユーザーの変更内容を上書きできます。これはデフォルトのロック・モードです。Beanが同時更新されることがない場合や、read-committedセマンティクスによる、同じ行に対する同時読取りおよび更新が十分である場合は、このモードを使用します。

関連項目: 『Oracle TopLink開発者ガイド』の、ロック方針の構成に関する項と記述子およびロックの概要に関する項 

通常、ロックなしのほうが高速ですが、データ整合性が必要とされる状況には適合しない場合があります。 

コミット時 

すべてのユーザーがデータに読取りアクセスします。ユーザーがデータを変更しようとすると、そのユーザーがデータを読み取った後にデータが変更されていないか、アプリケーションによってチェックされます。

関連項目: 『Oracle TopLink開発者ガイド』の、ロック方針の構成に関する項と記述子およびロックの概要に関する項 

 

即時 

更新目的でデータにアクセスした最初のユーザーによって、更新処理が完了するまでデータがロックされます。

関連項目: 『Oracle TopLink開発者ガイド』の、ロック方針の構成に関する項と記述子およびロックの概要に関する項 

同じ行に対して頻繁に同時更新を実行することが予想される場合、同時アクセスの例外と再試行が多数発生するコミット時ロックより、即時ロックのほうが高速になることがあります。Beanレベルで即時ロックを使用する場合、最高のパフォーマンスを実現するには、分離キャッシュとともに使用することをお薦めします。 

読取り専用 

CMP Beanの記述子を読取り専用に設定すると、エンティティBeanが変更不能になり、TopLinkで作業ユニットのパフォーマンスを最適化することができます。

関連項目: 『Oracle TopLink開発者ガイド』の、ロック方針の構成に関する項と記述子およびロックの概要に関する項 

Beanを読取り専用として定義すると、TopLinkによって作業ユニットのパフォーマンスが最適化されるため、読取り専用として定義されておらず、挿入、更新、削除を行わないBeanよりパフォーマンスが向上します。 

4.3.2.3 CMPリソースの監視

EJBメソッドの実行に著しく時間がかかっていないかを確認するには、oc4j_ejb_methodというDMSメトリック表のタイプとメトリックwrapper.avgまたはclient.avgをチェックします(メソッドのなかには、完了までに長時間かかることが予想されるものもあるので、異常に大きな値がないかを調べます)。たとえば、ejbCreatecreatefindAllの各メソッドや、アプリケーション固有のEJBメソッドのメトリック値をチェックします。

また次の手順に従って、Application Server Controlコンソールに表示されるメトリックをチェックすることで、レスポンス時間やトランザクション/秒が時間の経過とともにどのように推移しているかを確認できます。

  1. OC4Jホーム・ページから、「アプリケーション」サブタブを選択します。

  2. 表の「すべてのアプリケーション」で、監視するアプリケーションを選択します。

  3. モジュール」表で、監視するEJBモジュールを選択します。

また、CMP TopLinkのメトリックを参照して、CMPのパフォーマンスに関する追加情報を確認することもできます。


注意

TopLink関連のDMSメトリックの収集をオンにするには、DMS構成のOC4Jコマンドライン・プロパティ-Doracle.dms.sensorsの値を、HeavyまたはAllに設定する必要があります。 


関連項目

 


戻る 次へ
Oracle
Copyright © 2001, 2008, Oracle.

All Rights Reserved.
目次
目次
索引
索引