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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM