【问题标题】:How does Java EE EntityManager manage DB ConnectionJava EE EntityManager 如何管理数据库连接
【发布时间】:2013-01-30 16:50:08
【问题描述】:

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

但我如何确定它将在同一个会话中创建表并运行查询?

【问题讨论】:

  • JPA 中没有会话,你的意思是事务吗?
  • 我的意思是数据库连接会话。就像在 jdbc 中一样,您将拥有: Connection conn = DriverManager.getConnection(...) 然后 conn.close();所以每个连接都算作一个会话。
  • 这取决于很多变量 - 请阅读here

标签: java jakarta-ee jpa


【解决方案1】:

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

【讨论】:

【解决方案2】:

在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    相关资源
    最近更新 更多