3

Java Web Start を使用してデプロイするアプリケーションがあります。単体テストを行っているときに、ちょっとした問題に気付きました。Java Web Start を使用してアプリケーションを実行すると、特定の操作の実行に時間がかかるということです。ただし、ローカルで実行すると、非常に高速です。

私が話している特定の操作は、大きな (5k 行) Excel ファイルを読み取って解析することです。これはコード行です:

Workbook wb = WorkbookFactory.create(new FileInputStream(new File(inputFile.getText())));

問題を解決するために、時間を記録する方法を追加しました。

long time1 = System.currentTimeMillis();
Workbook wb = WorkbookFactory.create(new FileInputStream(new File(inputFile.getText())));
long time2 = System.currentTimeMillis();
long diff = time2 - time1;
double seconds = (double)diff / (double)1000;
DecimalFormat df = new DecimalFormat("#,##0.00");
System.out.println("Elapsed Time: " + df.format(seconds) + " seconds.");

そして、これは出力です:

(ローカル)

Elapsed Time: 4.83 seconds.

(Java ウェブスタート)

Elapsed Time: 35.52 seconds.

しかし、その後すぐに (Java Web Start で) 実行すると、次の結果が得られます。

Elapsed Time: 1.61 seconds.

私の疑いでは、これは POI ライブラリ (特に、POI を読み取るために必要なライブラリのサイズ、より具体的には 13 MB のooxml-schemas-1.0.jarライブラリ ファイル) に関係しているということです。だから、私の質問は次のとおりです。それがライブラリのサイズであると仮定すると、これを防ぐ方法はありますか? コントロール パネルからライブラリ キャッシュをオンにしていますが、ライブラリをキャッシュする必要があるように見えるのはなぜですか? ロードされると、高速です。しかし、最初は永遠にかかります。

これは、ライブラリの保存を許可していることを示すコントロール パネルの画像です。ここに画像の説明を入力

誰もこの種の行動を見たことがありますか?SSCCE がありません。なぜなら、Java Web Start の質問で SSCCE を投稿するにはどうすればよいでしょうか。

4

4 に答える 4

1

同様の問題がありましたが、ファイルから .docx ドキュメント (XWPFDocument) をロードしていました。ローカルで実行している間、ファイルのロードに 1 秒もかかりませんでした。ただし、Java Web Start を介して実行すると、私は約 35 秒、同僚は 30 分ほどかかりました。これが私が解決した方法です。うまくいけば、この問題も解決するかもしれません。

原因は Apache XMLBeans ライブラリ、または Apache POI での不適切な使用方法にありました。Apache POI リリースに含まれる XMLBeans ライブラリはバージョン 2.3.0 で、jar ファイルはxmlbeans-2.3.0.jarです。プログラムをローカルで起動するときにこれをクラスパスに含めると、問題なく動作します。ただし、リソースとして .jnlp ファイルに含めて、Web Start でプログラムを起動すると、説明したように動作が非常に遅くなります。Java コンソールを開いてトレース レベルを 5 に設定すると、.docx ファイルをロードすると、プログラムがリソースxbean.jarを探すことがわかります。.jnlp ファイルにこれさえないかもしれませんが。これにより、プログラムはタイムアウトになるまでリソースを検索し、おそらく何度も再試行するため、読み込み時間が遅くなります。

2011 年の POI Bugzilla (Bug 51660)に、これに関するバグ レポートがあります。

この問題を解決するには、 XMLBeansバージョン 2.5.0 をダウンロードし、xmlbeans-2.3.0.jarを含める代わりに、xbean.jarjsr173_1.0_api.jarをクラスパスに含め、.jnlp ファイルにリソースとして含めました。

于 2014-04-23T12:34:23.067 に答える
1

役に立たないことが 2 つあります。それらが完全な違いを説明するかどうかはわかりませんが、少なくともいくつか...

まずは、ライン

WorkbookFactory.create(new FileInputStream(new File(inputFile.getText())));

完全に優れたファイル オブジェクトができましたが、今では、それをすべてメモリにバッファリングするために多くの時間とリソースを浪費しています。POI ドキュメント で非常に明確に説明されているように、ファイルがある場合は直接使用してください。( docs に示されているように)次のように切り替えることで、時間とメモリを節約できます。

WorkbookFactory.create(new File(inputFile.getText()));

.

次に、POI コンポーネント ページから:

poi-ooxml には poi-ooxml-schemas が必要です。これは、ooxml-schemas jar の大幅に小さいバージョンです。より大きな ooxml-schemas jar は、通常、開発にのみ必要です。

したがって、非常に特別なニーズがない限り、完全なooxml-schemasjar をはるかに小さいpoi-ooxml-schemasjar に切り替えてください。これにより、すべての一般的なユースケースがカバーされます。これにより、ロードもはるかに高速になります。

于 2013-10-13T09:28:21.610 に答える
1

プロファイリングの結果に照らして、要素で<resources/>指定された属性を批判的に見直し、開発環境のものと比較する必要があります。特に、ヒープ サイズや VM の種類など、パフォーマンスに影響を与えるものに注目してください。<j2se/>.jnlp

<resources>
    <j2se
        version="1.6+"
        initial-heap-size="128m"
        max-heap-size="256m"
        java-vm-args="-server"/>
    …
</resources>
于 2013-10-13T03:39:16.747 に答える
1

jnlp で誤って download 属性を lazy に設定した場合は、このライブラリを熱心にダウンロードすることを示す必要があります。

<resources>
        <jar download="eager" href="uploads/lib/guice-multibindings-3.0.jar"/>
</resources>

つまり、アプリケーションが起動する前にキャッシュされます

デフォルトでは、jar および nativelib リソースは熱心にダウンロードされます。つまり、アプリケーションが起動される前に、アプリケーションを実行している JVM にダウンロードされ、ローカルで使用可能になります。jar 要素と nativelib 要素を使用すると、リソースを遅延として指定することもできます。これは、アプリケーションを起動する前にリソースをクライアント システムにダウンロードする必要がないことを意味します。

http://docs.oracle.com/javase/7/docs/technotes/guides/javaws/developersguide/syntax.htmlから

于 2013-10-13T10:24:06.367 に答える