2012-03-24 10 views
1

私が持っている問題についてあなたのアドバイスをいただきありがとうございます。シングルトン実装を使用したEjbキャッシュ

私はjboss、EJB 3.1環境で作業しています。

ユーザが特定の画面を入力するたびに、データベースに保存されたデータに基づいてツリーデータタイプを作成するためのトリガでなければなりません。 このツリーの計算には時間がかかることがあり、パフォーマンスが重くなる可能性があります。

次の要求は、UIから送信されます。

1. refreshTree - a trigger for building the tree 
2. isTreeReady - indicating whether the tree is ready to use, and called every x amount of time 
3. getTree - return the tree. 

これを構築するとき、私は、複数のユーザーが同時にこれらのアクションの一つ一つを実行しようとすることができます考慮すべき。

私は次のようにキャッシュとして実装について考えてきました:私はそれを持っている

@singleton 
public class TreeCache{ 

@EJB 
MyTree tree; 

boolean isTreeReady = false; 

@Lock(LockType.WRITE) 
public void refresh(){ 
     isTreeReady = false; 
     tree = calulcateTree() \\ heavy calculation 
     isTreeReady = true; 
} 

public boolean isTreeReady(){ 
     return isTreeReady; 
} 

public MyTree getTree(){ 
     return tree; 
} 

}

問題は、どのシナリオがあり得ることである。

  1. 最初のユーザーがツリーをリフレッシュし、ツリーが構築されます。
  2. 次に、2番目のユーザーがツリーの構築を開始し、isReadyフラグをfalseに初期化してから、最初のユーザーがツリーの計算に気づく前に、この場合は最初のユーザーは計算を完了するまで待つ必要があります彼は木を使うことができた)。

私は、(isTreeReadyフラグの代わりに)何らかの方法で読み取りロックを使用して試合を考えようとしていますが、私のニーズに合ったものは考えられません。

あなたは何をすることができますか?

ありがとうございました。

+0

このツリーはすべてのユーザーで同じですか?そうでない場合、シングルトンは良い考えではありません。彼らが同時にそれを求めるならば –

+0

、そしてはい。画面が読み込まれた後にツリーが更新されません(計算に重いため)。他に何が使えますか? –

+0

ツリーの計算後、画面を更新しなかった場合、すべてのユーザーが同じツリーを取得することも当てはまります –

答えて

1

@Singletonアノテーションを使用すると、コンカレントはコンテナによって管理されます。 1人のユーザーがメソッドを呼び出すと、すべてのメソッドに書き込みロックがあります。&他のユーザーからのメソッドに対する要求は、前のものが戻るのを待たなければなりません。

しかし、refresh()メソッドで明示的にロックを適用しているため、他のメソッド(isTreeReady()getTree()など)に他のユーザーが同時にアクセスできます。したがって、refresh()メソッドでロックを解除すると、一度に1人のユーザーしかメソッドにアクセスできなくなります。

  • LockType.READ:この方法は、同時にアクセス、または共有することができれば、多くのクライアントと、@Lock(LockType.READ)とシングルトンのビジネスまたはタイムアウトメソッドを注釈。

  • LockType.WRITE:クライアントがそのメソッドを呼び出している間に シングルトンセッションBeanは、他のクライアントにロックする必要がある場合@Lock(LockType.WRITE)でのビジネスやタイムアウトメソッドに注釈を付けます。エルス

、あなたはシングルトンBeanの注釈@ConcurrencyManagement(ConcurrencyManagementType.BEAN)を使用してBeanマネージャの同時実行を使用することによって、より良い制御を得ることができます。しかし、メソッドの同期、並行処理を自分で明示的に管理する必要があります。

質問からシナリオを正確に把握することはできませんが、適切なロック戦略を使用すると問題が解決する場合があります。

関連する問題