【问题标题】:When are connections taken/returned from a connection pool?何时从连接池中获取/返回连接?
【发布时间】:2013-08-19 14:53:09
【问题描述】:

我有一个使用 JPA(EclipseLink) 的简单 Java SE 应用程序。默认情况下,我有one 'default' connection pool,最多允许32 connections

假设我这样做:

EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("myPU");

//read
EntityManager em = emFactory.createEntityManager();

TypedQuery<Entity.class> q = em.createQuery("Select e from Entity e", Entity.class);
List<Entity> entities = q.getResultList();

em.close();

//write
em = emFactory.createEntityManager();

Entity e = new Entity();
em.getTransaction().begin();
em.persist(e);
em.getTransaction().commit();

em.close();
  • 什么时候真正从连接池请求连接,什么时候再次释放?
  • 一个查询可以从池中请求多个连接吗?
  • 如果我将最大连接数从 32 设置为 1 会有区别吗?

【问题讨论】:

    标签: jpa eclipselink connection-pooling


    【解决方案1】:

    好吧,我不知道 EclipseLink 是如何工作的,但是在 Hibernate 中,您可以设置连接释放策略以在语句、事务、entity_close、auto 之后释放连接到池。 link 但是我找不到 EclipseLink 这样的东西,所以我假设 EclipseLink 发布连接策略是在 entity_close 之后。

    所以,应该是这样的:

    EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("myPU");
    
    //read
    EntityManager em = emFactory.createEntityManager();
    
    TypedQuery<Entity.class> q = em.createQuery("Select e from Entity e", Entity.class);
    List<Entity> entities = q.getResultList(); << TAKE FROM POOL
    
    em.close(); << RELEASE
    
    //write
    em = emFactory.createEntityManager();
    
    Entity e = new Entity();
    em.getTransaction().begin(); << TAKE FROM POOL
    em.persist(e);
    em.getTransaction().commit();
    
    em.close(); << RELEASE
    

    【讨论】:

    • 连接是默认在 EclipseLink 中延迟获取的,不过也可以配置。使用默认配置,读取连接会立即释放回池中,因此 getResultList 将获取和释放连接。对于写入,它们也是延迟获得的,因此提交操作将获得和释放写入连接 - 我相信 begin() 让 EclipseLink 知道可能需要一个事务,但不一定立即启动。
    猜你喜欢
    • 2018-12-24
    • 2011-05-28
    • 2018-11-25
    • 2012-04-19
    • 2015-03-27
    • 2014-01-09
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多