【问题标题】:Is my @produced EntityManager thread safe in a servlet container?我的@produced EntityManager 线程在 servlet 容器中是否安全?
【发布时间】:2012-09-15 01:57:04
【问题描述】:

在我的一个项目中,我试图将我的持久性管理从应用程序切换到容器。我正在遵循这些说明: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();
    } 
    */
}

然后我有一个注入 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,我在其中注入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 jpa thread-safety


    【解决方案1】:

    你的容器是什么?从使用的注释来看,我认为它至少与 Java EE 6 Web Profile 兼容,在这种情况下,您过于复杂了。

    1. 本教程介绍了多个持久性单元的生产。您的应用程序中是否存在这种情况?如果不是这样,直接注入 EJB 会更可靠,也更不神奇 - 我也不确定单例生成的持久性上下文的事务行为。

    2. Singleton JpaDAO 意味着,在您的应用程序中一次只能有一个数据库操作,因此这是严重的性能瓶颈。它应该是无状态的(并通过传统方式注入其持久性上下文)。

    一般来说,实现您的 DAO 和业务逻辑,甚至将您的 JAX-RS 端点作为会话 EJB,并让容器正确处理并发和事务。 还可以使用其他示例来源,例如。 G。 Adam Bien'sJavaEE Patterns

    【讨论】:

      猜你喜欢
      • 2015-08-05
      • 1970-01-01
      • 2015-02-25
      • 2016-08-24
      • 2012-02-10
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多