最近写hibernate数据操作模板。对于SessionFactory和Session的使用突然冒出一个疑问,写一个关获取事务对象的方法start():
public void start() {
try {
stmt = HibernateUtil.getSessionFactory().getCurrentSession();
trans = stmt.beginTransaction();
} catch (HibernateException hibernateException) {
hibernateException.printStackTrace();
}
}
那么在每次调用start()方法时,那么SessionFactory对象实际上一直存在。如果我写一个close()方法是session.close(),SessionFactory始终不会被关闭,那这个会有什么性能上的影响吗?如果close()方法是HibernateUtil.getSessionFactory().close(),那么会将SessionFactory会关闭,以后每次调用start()方法都会去创建一个新的SessionFactory并在调用close()方法后关闭,这个又从控制台输出Hibernate运行信息中发现每次调用start()方法都会去重新加载Hibernate的配置,这对性能会有什么影响吗?
------解决方案--------------------
SessionFactory本身就不用关闭的,这个是创建session的工厂,对于session才需要close
------解决方案--------------------
sessionFactory不需要一直创建。构建sessionFactory是很费时的,他需要解析hibernate的配置文件,以及JPA注解。我们操作时都是用session,只有你整个项目都不用了才把sessionFactory关闭。
------解决方案--------------------
工厂 为嘛 要关闭

------解决方案--------------------
把SessionFactory弄成单例的,让它一直开着吧
------解决方案--------------------
sessionfactory为什么要关闭
------解决方案--------------------
这样说的话,那SessionFactory的是应该怎么创建比较好呢?我获取SessionFactory就放在start()方法里,那么每次Dao操作一个方法就会调用一次,那不就是一直在创建了呢?还是说SessionFactory本身被创建一次后就存在于整个项目的作用范围内被所有用户使用,其它调用start()方法的用户都能自动获取已经被创建的这个SessionFactory对象?
你可以把SessionFactory的创建写在专门的类中可以叫HibernateUtils里面用getSessionFactory获取SessionFactory,而这个SessionFactory应该是单例的。那么dao只要用HibernateUtils.getSessionFactory()就可以了
public class HibernateUtils{
private static SessionFactory sessionFactory;
static{
sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();
}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
}
------解决方案--------------------
工厂 为嘛 要关闭关了谁造小人
你来啊。。