1


0

Webサービスでキャッシュを作成しようとしています。 このために、このキャッシュを他のステートレスBeanに提供するために新しいステートレスBeanを作成しました。 このキャッシュは、MyObjectがPOJOである静的ConcurrentMapです。 問題は、異なるキャッシュオブジェクトがあるように見えることです。 1つはクライアントBean用、もう1つはローカル用です。

-CacheService -CacheServiceBean -getMyObject()-insertMyObject(MyObject)-size()

-SomeOtherBean cache = jndiLookup(CacheService)cache.insertMyObject(x)cache.size() - > 1

この割り当ての後、CacheServiceBean内からcache.sizeを呼び出すと、0が返されます。 Beanを通して静的なシングルトンを共有することさえ可能ですか? 最後に私はデータベーステーブルを使うことに決めました、しかし私はまだこれについて考えています。

ご回答ありがとうございます。

5 Answer


4


私が覚えている限りでは、ステートレスBeanが、静的フィールドにデータを保持するのに十分グローバルであることを確認することはできません。 これを手助けするいくつかのキャッシングフレームワークがあります。 多分http://www.whalin.com/memcached/[memcache]?

編集:http://java.sun.com/blueprints/qanda/ejb_tier/restrictions.html#static_fieldsは言う:

_ 非最終静的クラスフィールドはEJBでは許可されません。そのようなフィールドは、エンタープライズBeanの配布を困難または不可能にするためです。 _


3


表面的には、キャッシュはほとんど間違いなく私がステートレスとは考えないものであるため、これは用語の矛盾のように思えます。


1


ステートレスBeanを使用する場合、それらのインスタンスの数を管理することはできません(面倒を見るのはアプリケーションサーバーに任されています)。 クライアントから調べたものとは別のBeanからの出力を取得した可能性があります。 ログにそれを印刷しましたか? その場合は、おそらく複数の出力が表示されるはずです。 重要なのは、jndiを介してステートレスBeanをルックアップしたときに、どのインスタンスを取得したのかがわからないということです(単に取得するだけです)。 そして、あなたは状態を持っていないので、これがキャッシュのための最良の選択であるかどうか私は知りません。

静的シングルトンによって私はあなたがシングルトンオブジェクトを意味すると思いますか? はい、多くのBeanを通してシングルトンにアクセスすることは問題にならないはずです。 しかし、おそらく同時並行性の問題を覚えているでしょう。 アプリサーバー(一般的にはbean)はあなたからたくさんを抽象化しています。


1


@StatelessパブリッククラスCacheSessionBeanはCacheSessionLocalを実装しています{プライベートstatic Map cacheMap = new HashMap();

public Object getCache(String key){return cacheMap.get(key); }

public void putCache(String key、Object o){cacheMap.put(key、o); }}

クラスタ内のEJBの配布に関する警告は、静的変数にも当てはまります。 しかし、あなたがクラスタリングしていないのであれば、それらはほとんどあなたには当てはまらないので、このレベルでは統計は "okey dokey"です。

同期の問題があります。

これを軽減する1つの方法は、CacheSession Beanの単一インスタンスのみを作成してプールするようにコンテナーを構成することです。そうすれば、コンテナーがその同期を管理します。

同期化を自分で管理することもできますが、EJBメソッドレベルでそれを行うべきではありません。同期化されたCacheオブジェクトを使用するほうがよいでしょう(たとえば、一般的なHashMap)。

しかし重要なのは、この時点で静的変数は単に静的変数であるということです。

理論的には、Session Beanのコンテナーライフサイクルを認識する必要があります(すべてのインスタンスが解放される可能性があるため、実際のBeanクラスがGCに適格となり、静的データが失われる可能性があります)。 ただし、実際には、サービスが普及している場合、これは起こりそうもありません。 しかし、もしそうなら、それは起こるかもしれません。


1


この記事は少し前の投稿ですが、元の質問が目指していたキャッシュのニーズを満たす新しいSingleton Beanがあるようです。

_ シングルトンセッションBeanは、ステートレスセッションBeanと同様の機能を提供しますが、ステートレスセッションBeanのプールとは対照的に、アプリケーションごとにシングルトンセッションBeanが1つしかない点が異なります。 ステートレスセッションBeanと同様に、シングルトンセッションBeanはWebサービスエンドポイントを実装できます。 _

Webサービス/ステートレスBeanから問題を作成して参照してみました。 広告通りに働いた。