私が持っている問題についてあなたのアドバイスをいただきありがとうございます。シングルトン実装を使用した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;
}
}
問題は、どのシナリオがあり得ることである。
- 最初のユーザーがツリーをリフレッシュし、ツリーが構築されます。
- 次に、2番目のユーザーがツリーの構築を開始し、isReadyフラグをfalseに初期化してから、最初のユーザーがツリーの計算に気づく前に、この場合は最初のユーザーは計算を完了するまで待つ必要があります彼は木を使うことができた)。
私は、(isTreeReadyフラグの代わりに)何らかの方法で読み取りロックを使用して試合を考えようとしていますが、私のニーズに合ったものは考えられません。
あなたは何をすることができますか?
ありがとうございました。
このツリーはすべてのユーザーで同じですか?そうでない場合、シングルトンは良い考えではありません。彼らが同時にそれを求めるならば –
、そしてはい。画面が読み込まれた後にツリーが更新されません(計算に重いため)。他に何が使えますか? –
ツリーの計算後、画面を更新しなかった場合、すべてのユーザーが同じツリーを取得することも当てはまります –