JAXBContext の初期化の高速化? 質問する

JAXBContext の初期化の高速化? 質問する

多数のクラス (>1000) がある javax.xml.bind.JAXBContexts の初期化を高速化する方法はありますか? XML を多用するアプリケーションでは、起動時間は約 10 分で、主に JAXBContexts の初期化時間で構成されます。:-(

XSD からのコード生成には、JDK 1.5 の Sun の JAXB 実装と org.jvnet.jaxb2.maven2.maven-jaxb2-plugin を使用しています。

説明: 問題は、同じコンテキスト パスを持つ JAXBContext のインスタンスが多数あることではなく、1 つの JAXBContext の初期化に、何千ものクラスをロードして処理する必要があるため、数十秒かかることです (XSD はかなり大きく複雑です)。すべての JAXBContext インスタンスには異なるコンテキスト パスがあり、これ以上数を減らすことはできません。

ベストアンサー1

JAXB リファレンス実装には、まさにこの理由から、ある種文書化されていないシステム プロパティがあります。

-Dcom.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.fastBoot=true

またはパッケージのリファクタリング前の古いバージョンの場合:

-Dcom.sun.xml.bind.v2.runtime.JAXBContextImpl.fastBoot=true

これは、JAXB に、ジョブを実行するために必要なさまざまなリフレクション マッスルを事前にキャッシュするというコストのかかるプロセスをスキップするように指示します。代わりに、コンテキストが使用されるときにすべてのリフレクションを実行します。これにより、実行時間は遅くなりますが、特にクラスの数が多い場合は、初期化が大幅に高速化されます。

ただし、速度の問題の一部は避けられません。それは、JAXB がクラスを 1 つ 1 つロードする必要があり、クラスのロードが遅いという事実です。これは、最初のコンテキストの直後に同じ構成で 2 番目のコンテキストを作成すると明らかになります。クラスが既にロードされているため、はるかに高速であることがわかります。

また、複数のコンテキストパスがあるため、複数の JAXBContext インスタンスがあると言っています。複数のコンテキストパスを 1 つのコンテキストに配置できることをご存知ですか? コンテキストを初期化するときに、それらをすべてセミコロンで区切られた文字列として渡すだけです。例:

JaxbContext.newInstance("a.b.c:x.y.z");

コンテキストa.b.cとをロードしますx.y.z。ただし、パフォーマンスには影響しない可能性があります。

おすすめ記事