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

 

posted @ 2020-03-09 22:26  Jason–json  阅读(1650)  评论(0编辑  收藏  举报