Hibernate作为数据持久层,工作思路分为以下几步:加载配置,获取Configuration对象;根据Configuration配置信息创建SessionFactory工厂;获取Session;根据获得到的Session开启事务,之后便可执行操作;最后再关闭回收资源。Hibernate规定我们每一次操作都需要经过这几步流程。如果每一次都去加载配置,创建Session的话,那么当多个进程访问时,则会同时存在多个SessionFactory,而且多次读取配置,对服务器的硬盘也是一种消耗。
对此我需要把重复执行的代码进行封装,同时要求加载配置和创建sessionFactory是进程级的,java虚拟机一开启便创建,需要session便向SessionFactory(可以理解为连接池)请求,虚拟机关闭时再把资源回收,这样资源才不会造成太大的浪费。具体代码实现如下:
HibernateUtil.java
public class HibernateUtil{
private SessionFacory sf;
static{
//加载配置文件
Configuration conf = new Configuration().configure();
sf = conf.bulid.SessionFactory();
//虚拟机关闭时回收资源
Runtime.getRuntime().addShutdowmHook(new Thread(new Runnable(){
@Override
public void run(){
sf.close();
}
}));
}
public static org.hibernate.Session openSession(){
Session session = sf.openSession();
return session;
}
public static org.hibernate.Session getCurrentSession(){
Session session = sf.getCurrentSession();
return session;
}
}