问题:在Hibernate中每次执行一次操作总是需要加载核心配置文件,获取连接池等等都是重复动作,所以抽取出来
解决:
package com.xxx.utils; /** *Hibernate的工具类 *@author cxh */ import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HiberUtils { // 1.创建一个session回话工厂,以单例模式管理(简单的获取session第一种) private static SessionFactory sessionFactory; // 2.ThreadLocal存储session,一开始直接将session绑到当前线程,后面直接来获取线程中的session(第二种) private static ThreadLocal<Session> currentSession = new ThreadLocal<Session>(); //初始化获取session会话工厂 static { try { sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory(); } catch (HibernateException e){ e.printStackTrace(); throw new HibernateException("初始化会话工厂失败"); } } // 获取单例会话工厂 public SessionFactory getSessionFactory() { return sessionFactory; } // 获取session对象 public static Session openSession() { return sessionFactory.openSession(); } // 获取绑定到线程里面的session,如果获取不到就创建一个新的线程去绑定session public Session getCurrentThreadSession() { // 获取线程中的session Session s = currentSession.get(); if(s == null) { // 创建一个新的session s = sessionFactory.openSession(); // 将新的session与当前线程绑定 currentSession.set(s); } // 不为空,当前线程有session,直接返回 return s; } // 关闭当前线程的session public static void closeCurrentThreadSession() { // 获取当前线程绑定的session对象 Session s = currentSession.get(); // 当前线程有session对象,且该对象不为空,需要关闭 if(s != null) { s.close(); } currentSession.set(null); } // 3.hibernate中底层已经帮你封装了将session与当前线程绑定的方法 public static Session getCurrentSession() { return sessionFactory.getCurrentSession(); } //上面两种获取线程里面的session都可以直接调用该封装方法进行关闭 public static void closeSession() throws HibernateException { sessionFactory.getCurrentSession().close(); } }
原文地址:https://www.cnblogs.com/ends-earth/p/10762270.html
时间: 2024-09-27 16:43:33