12

struts2、spring、および JasperReport を使用する Java で作成された Web アプリケーションがあります。このアプリケーションは、glassfish 4.0 で動作します。

アプリケーションのライブラリは WEB-INF/lib フォルダーにあり、glassfish にも同じライブラリを使用する 4 つ以上がインストールされています。

Glassfish は、ヒープスペースに 1024mb、permgen に 512m を使用するように構成されています。アプリケーションごとにライブラリを使用する場合のメモリ消費のほとんどは、struts アクションと spring aop クラス (netbeans プロファイラーを使用) にあります。

私たちが抱えている問題は、アプリケーションごとにクラスローダにライブラリを配置することによって消費されるメモリの量です。これは、あまりにも多く、PermGen エラーが発生するためです。また、ユーザが増えるとアプリケーションの実行が遅くなることにも気付きました。

そのため、共有ライブラリを使用しようとし、それを domain1/lib フォルダーに配置しました。デプロイされた単一のアプリケーションでは、ロード時間とメモリ消費がはるかに低く、アプリケーションは一般的に高速に動作することがわかりました。しかし、残りのアプリケーションをサーバーにデプロイすると、ロードされた最初のアプリケーションのみが正常に機能し、struts2 アクションを呼び出すと残りのアプリケーションにエラーが発生します。これは、アプリケーションごとに struts2 と log4j の設定が若干異なるためだと考えています。

また、特定のライブラリのみを Glassfish に配置し、struts2 のみをアプリケーションに残そうとしましたが、すべてのライブラリが apache-common のライブラリに依存しており、それらのライブラリをどこに配置しても問題にならないため、InvocationTargetException エラーが表示されます。また、両方の場所に配置すると、アプリケーションは起動しません。

  1. 共有ライブラリを使用するための特別な設定やベスト プラクティスはありますか?
  2. 共有ライブラリを使用するが、アプリケーションごとに設定をロードする方法はありますか? または、すべて同じにするために設定を変更する必要がありますか?
4

4 に答える 4

2

いわゆるスキニー WARの作成を試みることができます。すべての WAR を EAR 内にパックし、すべての共通 JAR をEAR 内WEB-INF/libのフォルダーに移動します ( で設定するlib/ことを忘れないでください)。<library-directory>application.xml

于 2013-11-11T14:54:39.383 に答える
0

ライブラリを lib/ または lib/ext の下に配置しても、パフォーマンスの問題は解決しないと思います。アプリケーションのサイズ、利用可能な Heap および PermGen スペースなど、アプリケーションやサーバーの設定については何も書いていませんが、アプリごとに個別のライブラリを使用することをお勧めします。

ライブラリをサーバーディレクトリに配置すると、それらはすべてのアプリ間で共有されます。アプリケーションの 1 つだけを新しいフレームワークにアップグレードするか、それらのいずれかを取り除くかを選択できなくなります。展開は、特定のサーバー アーキテクチャにバインドされます。

そして、あなたはそれがあなたの問題を解決しなかったと書きました、それは新しい問題を引き起こすかもしれません.

サーバーのチューニングに数時間投資することをお勧めします。デフォルトで実行する場合は、より多くの PermGen と HeapSpace を割り当てます。

これで解決しない場合は、何が問題なのかを深く分析する必要があります。共有ライブラリは解決策になるかもしれませんが、問題はまだわかりません。IBM は、ヒープ ダンプを分析するためのクールで無料のツールをいくつか提供しています。これは良い出発点になる可能性があります。

于 2013-11-10T18:53:24.383 に答える
0

複数のアプリケーションまたはプロジェクト間で共有されるライブラリのインストールに関するガイダンスを求めてここに来ました。すべての共有ライブラリのコピーをプロジェクトにインストールすることが受け入れられていることを読んで、私は深く失望しています。したがって、10 個の Web アプリケーションがあり、そのすべてが httpcomponents-client、mysql-connector-java などを使用する場合、インストールにはそれぞれのコピーが 10 個含まれます。

この振る舞いは、私が PC を支持してメインフレームを放棄する動機となった考え方を痛烈に思い出させます。「自分のアプリケーションがどれだけ多くのリソースを消費するかは気にしない。実際、アプリケーションがリソースを大量に消費することを自慢できるようにしたい」という考えのようでした。すみません、投げている間にお願いします。

  • ライブラリによって公開されるインターフェイスは、開発者の気まぐれで変更されることのない不変の契約です。

  • 下位互換性と呼ばれるこの概念があります。それを壊すと、新しいインターフェイスが作成されます。

私は、これらの規則の文言と精神に忠実なインターフェイスを少なくとも 2 種類知っています。

  1. 最も古いのは、IBM System/370 システム ライブラリです。FooとがあるかもしれませんがFoo2、後者は、インターフェイスによって作成されたコントラクトを拡張および/または破棄して、Foo互換性を失わせます。

  2. Bell Labs Unix プロジェクトの初期から、標準 C ランタイム ライブラリは上記の規則に従っています。

  3. これはかなり新しいものですが、Microsoft COM インターフェイスの仕様では同じ規則が適用されます。

Microsoft は通常、 Win32 APIでもこれらのルールに準拠していますが、その API にはいくつかの例外があります。.NET Framework は、熱心に置き換えようとしている Java 環境の足跡を奴隷的に踏襲しているように見えます。

私は 1978 年からライブラリを使用しており、コードをライブラリに入れる目的は、コードを再利用可能にすることだと理解していました。各アプリケーションでライブラリ コードのコピーを維持すると、新しいプロジェクトごとに再度実装する必要がなくなりますが、アップグレードが非常に複雑になります。これは、ライブラリのコピーが 10 個 (またはそれ以上) あり、それぞれを更新する必要があるためです。

ライブラリがインターフェイスが不変の契約であるという規則に準拠している場合、ホスト上で実行されるすべてのものが単一のコピーを共有するディレクトリにあるUnixシステムライブラリと同様に、共有ライブラリディレクトリにあるべきではないのはなぜですか/lib標準 C ランタイム ライブラリ、Zlib などの。

私を真剣に失望させてください。

于 2017-09-20T05:34:12.077 に答える