EntityManager與線程的綁定,使用ThreadLocal類
編寫工具類
import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; public class JPAUtils { //類似SessionFactory private static EntityManagerFactory factory; private static ThreadLocal<EntityManager> tl; //加載配置文件 static { factory= Persistence.createEntityManagerFactory("myJPAUnit1"); tl=new ThreadLocal<EntityManager>(); } /* public static EntityManager createEntityManager(){ return factory.createEntityManager(); }*/ public static EntityManager createEntityManager(){ EntityManager em=tl.get(); if (em==null){ em=factory.createEntityManager();
tl.set(em); } return em; } //運行數據庫表自動生成 public static void main(String[] args) { createEntityManager(); } }
測試
//測試EntityManager對象獲取方式 @Test public void Test02(){ EntityManager em= JPAUtils.createEntityManager(); EntityManager em1= JPAUtils.createEntityManager(); System.out.println(em==em1); em1.close(); em.close(); }
輸出結果為true,EntityManager第二個對象是從線程池中獲取
線程池
配置主文件
<!-- c3p0的配置 --> <!-- hibernate.connection.provider_class使用c3p0數據庫連接池的一個配置 --> <property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider"></property>
測試connection
//測試C3P0連接池 @Test public void Test01(){ EntityManager em= JPAUtils.createEntityManager(); Session session = em.unwrap(Session.class); //通過em獲取Session session.doWork(new Work() { public void execute(Connection connection) throws SQLException { System.out.println(connection.getClass().getName()); } }); em.close(); }
輸出結果 com.mchange.v2.c3p0.impl.NewProxyConnection