JPA--EntityManager与线程的绑定,线程池
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