- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的一个项目中,我试图将持久性管理从应用程序切换到容器。我正在按照以下说明操作:http://docs.oracle.com/javaee/6/tutorial/doc/gkhrg.html
我读过有关 EntityManager 不是线程安全的内容,只是想确保我的设置正确。我关心的问题:http://weblogs.java.net/blog/2005/12/19/dont-use-persistencecontext-web-app 。
我有一个生成持久性上下文的类。
@Singleton
public class JpaResourceProducer {
//The "pu" unit is defined with transaction-type="JTA"
@Produces
@PersistenceUnit(unitName = "pu")
@Database
EntityManagerFactory databasePersistenceUnit;
@Produces
@PersistenceContext(unitName = "pu")
@Database
EntityManager databaseEntityManager;
/* Alternative
@PersistenceContext(unitName = "pu")
private EntityManager em;
@Produces
@UserDatabase
public EntityManager create() {
return em;
}
public void close(@Disposes @Database EntityManager em) {
em.close();
}
*/
}
然后我有一个注入(inject) DAO 的 jax-rs 资源。
@RequestScoped
@Path("/endpoint")
public class MyResource {
@Inject private Dao dao;
@GET
@Produces({MediaType.APPLICATION_JSON})
public Converter get() {
MyEntity entity = dao.find(1);
Converter converter = new Converter(entity);
return converter;
}
}
最后是一个 DAO
,我在其中注入(inject) EntityManager
。
@Singleton
public class JpaDao<T, K extends Serializable> implements Dao<T, K> {
protected Class<T> entityClass;
@Inject
@Database
EntityManager em;
public JpaDao() {
ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
this.entityClass = (Class<T>) genericSuperclass.getActualTypeArguments()[0];
}
public T find(K id) {
return em.find(entityClass, id);
}
....
}
1。就线程安全性和整体性能而言,这是一个很好的设置吗?
<小时/>奖励问题:
在JpaResourceProducer
中,我有一个EntityManager
的替代设置,我在处置时手动关闭管理器。
2。容器是否自动处理我的 EntityManager
关闭?
Oracle 的示例包含一个 EntityManagerFactory
。
3.当我使用 CMP 时,我真的需要 EntityManagerFactory
吗?
最佳答案
你的容器是什么?根据使用的注释,我认为它至少与 Java EE 6 Web Profile 兼容,在这种情况下,您会使事情变得过于复杂。
本教程介绍了多个持久性单元的生成。您的申请中是否存在这种情况?如果不是,简单注入(inject)到 EJB 中会更可靠,并且更少神奇 - 我也不确定单例生成的持久性上下文的事务行为。
Singleton JpaDAO
意味着,您的应用程序中一次只能有一个数据库操作,因此这是严重的性能瓶颈。它应该是无状态的(并通过传统方式注入(inject)其持久性上下文)。
一般来说,实现您的 DAO 和业务逻辑,甚至将您的 JAX-RS 端点实现为 session EJB,并让容器正确处理并发和事务。还可以使用其他来源的示例,例如。 G。 Adam Bien's JavaEE Patterns 。
关于java - 我的 @ Produced EntityManager 在 servlet 容器中线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12433914/
我是一名优秀的程序员,十分优秀!