28

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

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

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

4

4 に答える 4

42

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

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

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

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

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

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

また、複数のコンテキストパスがあるため、複数の JAXBContext インスタンスがあると言います。複数のコンテキスト パスを 1 つのコンテキストに入れることができることに気付きましたか? コンテキストを初期化するときに、セミコロンで区切られた文字列としてすべてを渡す必要があるだけです。

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

コンテキストa.b.cとをロードしx.y.zます。ただし、パフォーマンスに違いはありません。

于 2009-11-23T09:55:12.520 に答える
6

一般に、JAXBContext の多くのインスタンスを作成する必要はありません。これは、それらが構成された後はスレッドセーフであるためです。ほとんどの場合、コンテキストは 1 つだけで十分です。

では、多くのインスタンスが作成される特定の理由はありますか? おそらく、それらはスレッドセーフではないという仮定がありましたか? (これは明確に文書化されていないことを考えると理解できます-しかし、これは非常に一般的なパターンであり、構成中に同期する必要がありますが、構成が変更されていない限り使用中に同期する必要はありません).

これ以外に、これがまだ問題である場合は、ボトルネックをプロファイリングし、jaxb.dev.java.net で問題を報告する (プロファイルからホット スポットを指摘する) と、問題を改善するのに役立ちます。JAXB チームは非常に優れており、反応がよく、どこに問題があるかを示すことができれば、通常は適切な解決策を考え出します。

于 2009-04-28T18:13:47.310 に答える
3

JAXBContext は確かにスレッドセーフであるため、シングルトンでラップすることをお勧めします。仕事をしているように見えるクラス - >コンテキストマップを含む単純なシングルトンを書きました。アプリケーションが多くのスレッドを使用している場合は、[un]marshaller オブジェクトのプールを作成することもできます。これらのオブジェクトはスレッドセーフではなく、初期化ペナルティも発生する可能性があるためです。

于 2009-05-07T14:58:57.250 に答える
1

私たちの場合、JAXB ライブラリを更新することは良い考えでした。ちなみに、開発環境であっても、クライアント VM の代わりにサーバー VM を使用することは、通常はサーバーの起動が遅くなりますが、ここでは良い考えでした。

于 2009-11-23T09:48:21.990 に答える