したがって、BalusCのこの投稿から、ステートレス セッション Bean が JSF によってアクセスされたときにデータ ストア (DB など) を継続的にスラッシングするのを防ぐ方法 (複数の呼び出しを行う可能性があります) を読んだので、コードを実装しました。 BalusCによって投稿された内容(およびこの問題に関して私が見た「ベスト プラクティス」からの他のフォーラム投稿)の精神にあると考えたいと思います。
私のステートレス セッション Bean は次のようになります。
@Stateless
@Named("productsService")
public class ProductService {
private static boolean changed = true;
private List<Product> products;
private long count;
@PersistenceContext(name = "myPU")
private EntityManager em;
@Inject
private Product product;
public ProductService() {
}
private void productRecordsFromDB() {
products = em.createNamedQuery("Product.getAll", Product.class).getResultList();
Object o = em.createNamedQuery("Product.getCount", Product.class).getSingleResult();
count = ((Long) o).longValue();
}
public void addProduct() {
synchronized (ProductService.class) {
changed = true;
em.persist(product);
}
}
public long countProducts() {
return count;
}
public void removeProduct(Product p) {
synchronized (ProductService.class) {
changed = true;
em.remove(em.merge(p));
}
}
public int removeAllProducts() {
synchronized (ProductService.class) {
changed = true;
return em.createNamedQuery("Product.deleteAll").executeUpdate();
}
}
public List<Product> getProducts() {
synchronized (ProductService.class) {
if (changed) {
productRecordsFromDB();
changed = false;
}
return products;
}
}
public Product getProduct() {
return product;
}
public void setProduct(Product p) {
product = p;
}
}
編集:シリアルアクセスを確実にするために、関連する部分に同期ブロックを追加しましたが、これはシングルトンのように感じ始めています。データストアへの複数の呼び出しに関連するこの問題に他の人がどのように対処したかを知りたいです。
具体的には、チェックされる「ダーティ」フラグを作成しました。DB が更新された場合、ダーティ フラグは (DB の更新によって) true に設定されます。ダーティ フラグが検出されると、フラグは false に戻されるため、DB への呼び出しは 1 回だけ行われます。したがって、DB のスラッシングは発生しません。
私の質問は次のとおりです:私がやったこと、これは解決策を解決するための適切な「ベストプラクティス」ですか、それとも私が気付いていないより賢い方法はありますか? 私は、古い「J2EE」ブルー プリント デザイン パターンと、Java EE 6 のコンテキスト内で欠落している可能性のある注釈の観点から考えています。