当前位置: 代码迷 >> Java Web开发 >> 关于hibernate的SessionFactory和Session的使用有关问题
  详细解决方案

关于hibernate的SessionFactory和Session的使用有关问题

热度:96   发布时间:2016-04-16 22:24:58.0
关于hibernate的SessionFactory和Session的使用问题
最近写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
------解决方案--------------------
引用:
Quote: 引用:

SessionFactory本身就不用关闭的,这个是创建session的工厂,对于session才需要close


我得到SessionFactory是new AnnotationConfiguration().configure().buildSessionFactory()本身也有提供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;
   }
}

------解决方案--------------------
引用:
工厂 为嘛 要关闭 关了谁造小人

你来啊。。 
  相关解决方案