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

Java EE EntityManager如何管理数据库连接,java,jakarta-ee,jpa,Java,Jakarta 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();

假设我有一个
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
        ...
        ...
    } 
}
@PersistenceContext(unitName=“myPU”)
私人实体管理者;
公共void runQuery()
{

对于(int i=0;i注入的EntityManager有一个到DB的连接,该连接来自容器管理的连接池。因此,上面代码中的所有查询都将在到数据库的同一连接上运行。

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

JTA管理的JPA EntityManager在JTA事务期间将使用相同的JDBC/数据库连接。因此,只要您的方法在JTA事务中,您的代码将具有相同的连接。通常默认情况下,SessionBean方法是事务性的,因此每个方法都应该在自己的事务中,除非您有配置你可以换一种方式

看,,

在JPA中没有会话,你是说事务吗?我的意思是数据库连接会话。就像在jdbc中一样,您将有:connection conn=DriverManager.getConnection(…),然后是conn.close();因此,每个连接都算作一个会话。这取决于相当多的变量-read。是否有相关文档?我错了,在OpenJPA中,您可以配置EntityManager如何使用DB连接,请参见:在EclipseLink中,您可以使用此属性在每个EntityManger中获得独占连接:
    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
        ...
        ...
    }