gpt4 book ai didi

java - 我的 @ Produced EntityManager 在 servlet 容器中线程安全吗?

转载 作者:行者123 更新时间:2023-12-02 08:23:32 25 4
gpt4 key购买 nike

在我的一个项目中,我试图将持久性管理从应用程序切换到容器。我正在按照以下说明操作: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 兼容,在这种情况下,您会使事情变得过于复杂。

  1. 本教程介绍了多个持久性单元的生成。您的申请中是否存在这种情况?如果不是,简单注入(inject)到 EJB 中会更可靠,并且更少神奇 - 我也不确定单例生成的持久性上下文的事务行为。

  2. 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com