JAXBContext の作成に必要な時間の削減
JAXB クラスである可能性があるものを対象としたクラス・ローダーの検索は、Web サービス・アプリケーションが開始されるごとに毎回実行されます。アプリケーションの検索プロセスが非常に長い場合、システムがアプリケーションの JAXBContext の作成に費やす時間を削減する方法がいくつかあります。
- JAXB クラスが含まれる可能性があるパッケージのリストの作成。
リストは、WSDL およびアノテーションの内容に基づいて作成されます。パッケージのリストを作成するために必要な時間を削減するオプションはありません。ただし、まれにしか見られない事例および特有の使用シナリオとして、JAXB クラスを含まないパッケージがパッケージ・リストに組み込まれる場合もあることを知っておくことは重要です。 以下に、JAXB クラスを含まないパッケージが組み込まれていることを示すトレース・メッセージの例を示します。
Here is an example trace that indicates this situation12/2/11 6:24:40:548 PST] 0000003e JAXBUtils 1 org.apache.axis2.jaxws.message.databinding.JAXBUtils createJAXBContextValue Package com.company.queryall.v1 does not have any JAXB classes. It is removed from the JAXB context path.
このメッセージが出現するたびに、パッケージ内に空の jaxb.index ファイルを組み込んで、JAXB クラスがないことを示す必要があります。このアクションを取らないと、時間のかかる JAXB クラス検索が行われます。
- 開始する JAXBContext.newInstance() の署名の決定。 JAXBContext.newInstance() の開始は、パッケージのリストと JAXB クラスのリストのどちらを使用しても行うことができるため、どちらの方法を使用するかを、お客様の目標に基づいて決定する必要があります。
- 実際に JAXBContext オブジェクトを作成する JAXBContext.newInstance() の開始。
以下のアクションを実行することで、JAXBContext の作成に必要な時間が削減される場合があります。
- JAXB 検索結果の永続キャッシュを使用可能にします。各パッケージの検索結果の永続キャッシュを使用可能にするには、com.ibm.ws.websvcs.getJAXBContext.cacheClassList.persist Java™ 仮想マシン (JVM) カスタム・プロパティーを true に設定します。
JAXBContext のパッケージのいずれにも ObjectFactory や jaxb.index ファイルが含まれていない場合は、パッケージごとに潜在的な JAXB クラスのクラス・ローダー検索が実行されます。 大規模なクラス・ローダーが呼び出される場合、この検索には非常に時間がかかる可能性があります。 com.ibm.ws.websvcs.getJAXBContext.cacheClassList.persist JVM カスタム・プロパティーを使用すると、検索されたパッケージごとに検索結果を永続的にキャッシュに入れることができます。その後、JAXBContext 要求は、それらのパッケージの新規検索を実行する代わりに、キャッシュに入れられたクラスのリストを使用します。
キャッシュは、アプリケーションの更新またはアンインストール時に除去されます。この方法では、パッケージのリストを提供する場合ほどパフォーマンスが向上しない可能性がありますが、アプリケーションに変更を加える必要がありません。
このアクションは、jaxb.index ファイルを使用することを予定している場合でも、最初のステップとして推奨されます。
- ObjectFactory クラスが含まれないすべてのパッケージの jaxb.index ファイルを指定します。
このアクションにより、システムは JAXB クラスの検索を完全に回避することができます。
この方法では、jaxb.index ファイルを追加することを考慮してアプリケーションを変更する必要があります。
JAXB クラスが含まれるパッケージのリストは、すべてのパッケージに、ObjectFactory クラスが含まれるか、またはパッケージの JAXB クラスを指定する jaxb.index ファイルが含まれる場合に使用できます。ObjectFactory クラスまたは jaxb.index ファイル内の JAXB クラスのリストを指定した場合、JAXB クラスの検索は不要です。
パッケージのリストを使用するとパフォーマンスが大きく向上しますが、手動で jaxb.index ファイルを作成し、アプリケーションに変更を加えることが必要になる場合があります。この方法を使用する場合は、デバッグ・トレース・ログで does not contain an ObjectFactory というメッセージを確認することで、更新する必要があるパッケージ数を判別することができます。
jaxb.index ファイルは、最適なパフォーマンスを必要とし、アプリケーションの変更を行う意思がある場合に使用可能です。 ObjectFactory クラスは、通常、トップダウン・ツール (wsimport) でのみ作成されます。したがって、ボトムアップ・ツール wsgen で開発されたパッケージには、おそらく ObjectFactory クラスは含まれません。jaxb.index ファイルは、パッケージ内の JAXB クラスを識別し、コンテキストの作成にかかる時間を少なくするために使用されます。JAXBContext.newInstance() メソッドは、ObjectFactory クラスを受け入れるのと同じ方法で jaxb.index ファイルを受け入れます。
jaxb.index ファイルを使用する場合は、トレース・ファイル内でパッケージに ObjectFactory クラスが含まれないことを示すすべてのインスタンスを評価し、適切な jaxb.index ファイルを作成する必要があります。 トレース内で、jaxb.index ファイルが必要なパッケージを示す does not contain an ObjectFactory というメッセージを検索した後、以下を行う必要があります。- JAXB クラスのリストを含む jaxb.index ファイルを作成します。パッケージに JAXB クラスが含まれていない場合は、空の jaxb.index ファイルをパッケージに入れる必要があります。
- トレース操作を再実行して、does not contain an ObjectFactory というメッセージがトレースに出現しなくなっていることを確認します。
必要な JAXB クラスが欠落していて jaxb.index ファイルに含まれていない場合は、このクラスが JAXBContext に認識されていないこと、および、このクラスを jaxb.index ファイルに追加する必要があることを示すエラーが発生します。
JAXB クラス検索を回避するには、JAXBContext で使用されるすべてのパッケージに ObjectFactory クラスまたは jaxb.index ファイルが必要です。これは、トレース・ファイルを調べる必要があり、欠落している ObjectFactory クラスの各インスタンスまたは jaxb.index ファイルに対処する必要があることを意味します。 JAXBContext のパッケージが ObjectFactory クラスも jaxb.index ファイルも含んでいないと確認された場合は、時間のかかる JAXB クラス検索が実行されます。 jaxb.index ファイルの形式については、JAXBContext.newInstance() についての Oracle Javadoc (http://docs.oracle.com/javaee/5/api/javax/xml/bind/JAXBContext.html) で文書化されています。
移行ユーザーの方へ: バージョン 7.0 では、wsgen を使用して生成クラスを作成する場合でも、これらのクラスは保持されません。ただし、JAX-WS 仕様 2.2 では、生成クラスは保持される必要があります。したがって、wsgen は生成クラスを packagename/jaxws ディレクトリーに配置します。そのため、検索対象のパッケージのリストには packagename/jaxws が含まれるようになりましたが、これは EAR ファイルには存在しません。 この状態が発生すると、以下のようなエラー・メッセージを受け取ります。
このエラーを解決するには、以下のようにすることができます。6/21/12 17:07:36:477 CDT] 0000001a JAXBContextTr 1 org.apache.axis2.jaxws.message.databinding.JAXBUtils createJAXBContextValue JAXBContextCreate: Package somepackage.jaxws does not contain an ObjectFactory or package-info class. Searching for JAXB classes
- 2 つの異なる EAR ファイル (1 つはバージョン 7.0 で使用するために somepackage.jaxws jaxb.index ファイルがないもの、もう 1 つは現行バージョンの製品で使用するために somepackage.jaxws jaxb.index ファイルがあるもの) を作成します。
- 両方のバージョンの製品で単一の EAR ファイルを使用する場合は、生成クラスおよび jaxb.index ファイルを EAR ファイルに追加します。 このオプションを使用する場合は、生成クラスと共に WSDL も組み込む必要があります。
- jaxb.index ファイルの代わりに、永続キャッシュを使用します。このオプションにより、JAX-RS は依然として JAXB クラスの検索を 1 パッケージにつき一度行いますが、その結果は保持されるため、アプリケーションが更新されるまで検索を再度行う必要はありません。
- JAXBContext.newInstance() 自体の完了に長い時間がかかる場合は、jaxws.JAXBContext.permStoreCostThresholdMsec JVM カスタム・プロパティーを使用すると、ガーベッジ・コレクション時に失われない、JAXBContext オブジェクトのハード参照キャッシュを作成することができます。
実際の JAXBContext インスタンスの作成を変更または改善するオプションはありません。コンテキストのインスタンス化に費やされる時間は、JAXB クラスの数、パッケージの数、クラスパスのサイズなど、多くの要因によって影響を受けます。作成された JAXBContext は、メモリー内のソフト参照キャッシュ内に保持されます。そのため、使用可能メモリーが少なくなった場合、ガーベッジ・コレクションによって JAXBContext が破棄される可能性があります。その場合、破棄された JAXBContext を必要とする次の要求で、JAXBContext が再作成される必要があります。ほとんどの JAXBContext ではこの再作成プロセスが大きく影響することはありませんが、例外的に newInstance() ステップ自体にかなりの時間がかかる場合があります。
アプリケーションの JAXBContext で newInstance() の作成時間が長くかかる場合は、以下の JVM カスタム・プロパティーを使用して、JVM またはアプリケーションが再始動されるまで保持されるキャッシュに JAXBContext を配置することを検討してください。
- jaxws.JAXBContext.permStoreCostThresholdMsec
- このプロパティーをミリ秒単位でゼロ以外の値に設定します。構成するために指定された時間よりも多くの時間を必要とするコンテキストがキャッシュされます。推奨値は 5000 以上です。デフォルト値は 0 です。このプロパティーが 0 に設定されている場合、キャッシュは使用されません。
- jaxws.JAXBContext.permStoreMaxSize
- このプロパティーを、キャッシュ内に維持する項目の最大数に設定します。 デフォルト値は 32 です。キャッシュが満杯になると、作成に要する時間が最小限で済む JAXBContext が、作成時間のより長い JAXBContext 用のスペースを作るためにキャッシュから除去されます。
- jaxws.JAXBContext.permStoreStaleThresholdHours
- このプロパティーを、キャッシュ内に項目を残す時間の長さ (時間単位) に設定します。 指定した時間数の経過後にアクセスされていないキャッシュ内の項目は、新しい項目をキャッシュに追加する前に除去されます。デフォルト値は 24 時間です。