如何在 CDI 环境中管理 EntityManager 生命周期(使用 Tomcat)
我正在开发一个应用程序,并且已经开始与 和 一起使用。Web 容器是 。CDI
JSF
JPA
Tomcat
我对豆子的生命周期感到非常困惑,我需要一个好的建议来清除我脑海中的一些东西。一般来说,我读到的是,它应该主要在容器中使用,使用注释注入它。因此,容器会照顾到它的寿命。但是,如果你不使用容器(as),那么我需要管理我的生活。EntityManager
CDI
EntityManager
Java EE
PersistenceContext
Java EE
Tomcat
EntityManager
我现在使用哪些是最好的选择?我现在正在做的是:Tomcat, CDI, JSF and JPA
public class EntityManagerFactoryProducer {
public static final String TEST = "test";
@Produces
@ApplicationScoped
public EntityManagerFactory create() {
return Persistence.createEntityManagerFactory(TEST);
}
public void destroy(@Disposes
EntityManagerFactory factory) {
factory.close();
}
}
public class EntityManagerProducer {
@Inject
private transient Logger logger;
@Inject
private EntityManagerFactory emf;
@Produces
public EntityManager create() {
return emf.createEntityManager();
}
public void destroy(@Disposes
EntityManager em) {
em.close();
logger.debug(String.format("%s Entity manager was closed", em));
}
}
@Named
@ViewScoped
@Interceptors(LoggingInterceptor.class)
public class ProductBacking implements Serializable {
@Inject
private ProductDAO productDAO;
@ViewScoped
public class ProductDAOImpl implements ProductDAO, Serializable {
private static final long serialVersionUID = 4806788420578024259L;
private static final int MAX_RANDOMIZED_ELEMENTS = 3000;
@Inject
private transient Logger logger;
@Inject
private EntityManager entityManager;
@Override
public List<Product> getSuggestedProducts() {
logger.debug(String.format("%s Entity manager get products", entityManager));
return entityManager.createQuery("SELECT p FROM Product p ORDER BY random()", Product.class).setMaxResults(
MAX_RANDOMIZED_ELEMENTS).getResultList();
}
@Override
public void saveProduct(Product product) {
logger.debug(String.format("%s Entity manager save product", entityManager));
entityManager.getTransaction().begin();
entityManager.merge(product);
entityManager.getTransaction().commit();
}
@PreDestroy
void destroy() {
entityManager.close();
}
}
所以基本上我只是用普通来完成这个。但是,我不确定这是否是标准的做事方式,更重要的是,我不知道该如何关闭豆子生活结束后。作为总结:我最终有许多未关闭的连接(s),所以内存泄漏。CDI
EntityManager
EntityManager
有人可以帮助我了解我应该如何继续吗?