Java EE EntityManager如何管理数据库连接

时间:2013-01-30 16:50:09

标签: java java-ee jpa

假设我有一个EntityManager对象em,我有以下伪代码:

@PersistenceContext(unitName = "myPU")
private EntityManager em;

public void runQuery()
{
    for(int i=0; i<100; i++)
    {   Query q = em.createNativeQuery(someQuery);
        List list = q.getResultList();
        //process result
        ...
        ...
    } 
}

entityManager如何管理底层数据库连接?以上代码只有1个连接会话或100个会话吗?

我要问的是,对于每个连接会话,我需要在运行查询之前创建临时表。我想做的是这样的事情:

    for(int i=0; i<100; i++)
    {   //first check if temp table does not exist
         createTemptTable;
       // then run the query
        Query q = em.createNativeQuery(someQuery);
        List list = q.getResultList();
        //process result
        ...
        ...
    } 

但我怎么能确定它会在同一会话中创建表并运行查询?

2 个答案:

答案 0 :(得分:1)

注入的EntityManager与数据库有一个连接,该连接取自容器管理的连接池。因此,上述代码中的所有查询都将在与数据库相同的连接上运行。

答案 1 :(得分:1)

在Java EE中,在SessionBean中,持久性上下文由Java EE容器管理。注入的EntityManager通常是保存真实JPA EntityManager的代理。在每个JTA事务边界中,代理将释放其JPA EntityManager并获取一个新的(或至少clear()它)。在事务之外,容器可以为每个操作获取一个新的EntityManager,或者可以保存一个(这在规范中没有很好地定义,但是假设它是每个请求的新实体)。

受JTA管理的JPA EntityManager将在JTA事务期间使用相同的JDBC /数据库连接。因此,只要您的方法处于JTA事务中,您的代码就会具有相同的连接。通常,SessionBean方法默认是事务性的,因此每个方法都应该在自己的事务中,除非您对它进行了不同的配置。

请参阅, http://en.wikibooks.org/wiki/Java_Persistence/Runtime#Java_Enterprise_Edition