因此,我从 BalusC 的这篇文章中读到了如何阻止无状态会话 bean 在被 JSF 访问(可能/将进行多次调用)时不断破坏数据存储(例如 DB),所以我已经实现了我的代码'd like to think is in what was posted by BalusC (and other forum posts from "best practice" I've seen about this issue).
我的无状态会话 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;
}
}
编辑:我已将同步块添加到相关部分以确保串行访问,尽管现在这开始感觉更像是一个单例。我仍然很想知道其他人如何处理与多次调用数据存储有关的问题。
具体来说,我创建了一个检查的“脏”标志,如果数据库已更新,则脏标志设置为 true(通过更新数据库)。在检测到脏标志后,它被设置回假,因此只调用了一次数据库。因此,不会发生 DB 抖动。
我的问题是:我所做的,这是解决解决方案的适当“最佳实践”,还是有一种我不知道的更聪明的方法?我在考虑旧的“J2EE”蓝图设计模式以及可能在 Java EE 6 的上下文中丢失的注释。