HibernateSessionFactory里取session用的是单例模式。
不是说 session 单例 。 而是说 HibernateSessionFactory 单例。
也就是SessionFactory 单例 因为这个是hibernate 的重量级缓存。一般只要加载一次。
通过HibernateSessionFactory取得的session是通过工厂生产的。不是单例,每次取出的都是
不同的session (session缓存是轻量级的)
不是说 session 单例 。 而是说 HibernateSessionFactory 单例。
也就是SessionFactory 单例 因为这个是hibernate 的重量级缓存。一般只要加载一次。
通过HibernateSessionFactory取得的session是通过工厂生产的。不是单例,每次取出的都是
不同的session (session缓存是轻量级的)
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 .
个人认为这个不是单例(单例不会被不停的销毁)。
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
http://blog.csdn.net/caoyinghui1986/archive/2008/05/24/2476162.aspx
希望可以帮你释疑.