3

複数の EJB で共有する必要がある LDAP 検索結果を格納するために JCS を使用しています。JCS を 1 回だけ初期化するシングルトン クラスを作成しましたが、EJB のクラスローダーが原因で、独自のコピーで複数回初期化されています。そのため、検索リソースは共有されません。

複数の Bean 間でキャッシュを共有する必要がある問題をどのように解決していますか? JVM 内でキャッシュを探しています。(memcached などのリモートではありません)。

Glassfish は、アプリケーション サーバーとして使用されます。

4

2 に答える 2

2

まだテストできていませんが、使用している Glassfish のバージョンのアプリケーション開発ガイドの「クラス ローダー分離の回避」の章で説明されている手法の 1 つが問題を解決する可能性があると思います。


少なくともバージョン 2-3-4 で有効な短いバージョン: Common Classloader を使用します (この Common Classloader が正確に行うことと、他の Classloader との関係については、同じマニュアルで説明されています)。これを行うにはいくつかの方法があります。

  • jar をdomain-dir /libにコピーします。
  • または、jar をas-install /libにコピーします。
  • または実行asadmin add-library --type common /path/to/your.jar(バージョン 4 iirc でのみ機能します)

「クラスローダー分離の回避」に関連するSOに関するいくつかの質問があります(その検索語を使用してください)。例と詳細な議論を探してください。

于 2009-10-02T00:49:14.523 に答える
1

簡単に言えば、シングルトンは、クラスを「所有」する階層内のクラスローダーであるため、キャッシング実装クラスが存在する場所に「存在」する可能性があります。

したがって、各EJBがキャッシュlib jarの独自のコピーを使用して個別にデプロイされている場合、各EJBはそれぞれ独自のコピーを取得します。

Beanが複合EARにデプロイされ、lib jarの単一インスタンスを共有している場合、そのキャッシュはEAR内のBean間で共有されます。

デプロイメントからlibを完全に削除し、それをコンテナーの外部(たとえば、$ DOMAIN / lib / ext)に置くと、そのキャッシュはドメイン内のすべてのもの(EJB、EAR、WARなど)によって共有されます。

于 2009-10-02T01:01:18.963 に答える