1

假设我有一个EntityManagerobject 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
        ...
        ...
    } 

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

4

2 回答 2

1

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

于 2013-01-30T19:13:23.473 回答
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

于 2013-01-31T14:06:26.020 回答