2013-08-19 69 views
2

我有一個簡單的使用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,會有什麼區別嗎?

回答

2

好了,我不知道怎麼的EclipseLink工作,但在Hibernate中你可以設置連接釋放戰略釋放連接池後:聲明,交易,entity_close,汽車。 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 
+2

連接是默認在懶洋洋的EclipseLink獲得的,儘管它可以被配置爲好。使用默認配置,Read連接立即釋放回池,所以getResultList將獲取並釋放連接。對於寫操作,它們也會被懶惰地獲得,所以提交操作將獲得並釋放寫連接 - 我相信begin()可以讓EclipseLink知道可能需要的事務,但不一定馬上啓動。 – Chris

相關問題