3

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

EntityManagerFactory3.当我使用 CMP 时,我真的需要一个吗?

4

1 回答 1

0

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

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

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

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

于 2012-09-16T10:29:22.693 回答