HibernateSessionFactory里取session用的是单例模式。 
不是说 session 单例 。 而是说 HibernateSessionFactory 单例。
也就是SessionFactory 单例 因为这个是hibernate 的重量级缓存。一般只要加载一次。
通过HibernateSessionFactory取得的session是通过工厂生产的。不是单例,每次取出的都是
不同的session (session缓存是轻量级的)

解决方案 »

  1.   


                   Session session1= HibernateSessionFactory.getSession();
    session1.close();
    //HibernateSessionFactory.closeSession();

    Session session2 = HibernateSessionFactory.getSession();
    session2.close();
    //HibernateSessionFactory.closeSession();

    System.out.println(session1+"__"+session2);


    System.out.print(session1==session2);lz把上面的代码测试一下看是否还是true.
    你得出的结论为true 是因为你的session没有关闭。HibernateSessionFactory 再的到一个session 后 如果session为 null 就通过
    threadLocal.set(session); 这就 将session 注册到当前的线程上。当你在同一线程中在去拿的时候。如果当前线程还有没有关闭的session 就直接取出来来 。所以 lz得出 session是单例的结论。 
    Hibernate 事实上是在不停的创建(getSession())和销毁(close)  session . 
    个人认为这个不是单例(单例不会被不停的销毁)。 
      

  2.   

    lz  取两个不同的session  不妨 自己在HibernateSessionFactory 扩展一个方法  public static Session getAnotherSession() throws HibernateException{
         if (sessionFactory == null) {
    rebuildSessionFactory();
    }
         return sessionFactory.openSession();
           
        }下面代码通过测试 结果为 false; false;                Session session1= HibernateSessionFactory.getSession();
    Session session2 = HibernateSessionFactory.getAnotherSession();
    Session session3 = HibernateSessionFactory.getAnotherSession();


    System.out.println(session1==session2);
    System.out.println(session2==session3);
    这样即可以保证 SessionFactory 不被重复加载 。又可以在同一线程下获得任意多个 session
      

  3.   

    很感谢你提出这个问题 对此我专门写了一篇blog
    http://blog.csdn.net/caoyinghui1986/archive/2008/05/24/2476162.aspx
    希望可以帮你释疑.