轻松理解Hibernate Session管理入门
创始人
2024-06-07 20:51:55
0

本文就Hibernate  Session的入门加以简单介绍。

Hibernate  Session是Hibernate运作的中心,对象的生命周期、事务的管理、数据库的存取,都与 Session息息相关,就如同在编写JDBC时需关心Connection的管理,以有效的方法创建、利用与回收Connection,以减少资源的消耗,增加系统执行效能一样,有效的Session管理,也是Hibernate应用时需关注的焦点。

Hibernate Session是由SessionFactory所创建,SessionFactory是执行绪安全的(Thread-Safe),您可以让多个执行绪同时存取SessionFactory而不会有数据共享的问题,然而Session则不是设计为执行绪安全的,所以试图让多个执行绪共享一个 Session,将会发生数据共享而发生混乱的问题。

在Hibernate参考手册中的***章快速入门中,示范了一个HibernateUtil,它使用了ThreadLocal类别来建立一个 Session管理的辅助类,这是Hibernate Session管理一个广为应用的解决方案,ThreadLocal是Thread- Specific Storage模式的一个运作实例,您可以在下面这篇文章中了解Thread-Specific Storage模式:
designpattern:Thread-Specific Storage

由于Thread-Specific Stroage模式可以有效隔离执行绪所使用的数据,所以避开Session的多执行绪之间的数据共享问题,以下列出Hibernate参考手册中的HibernateUtil类:

  1. HibernateUtil.java   
  2. import net.sf.hibernate.*;   
  3. import net.sf.hibernate.cfg.*;   
  4.  
  5. public class HibernateUtil {   
  6.  
  7. private static Log log = LogFactory.getLog(HibernateUtil.class);   
  8.  
  9. private static final SessionFactory sessionFactory;   
  10.  
  11. static {   
  12. try {   
  13. // Create the SessionFactory   
  14. sessionFactory = new Configuration().configure().buildSessionFactory();   
  15. } catch (Throwable ex) {   
  16. log.error("Initial SessionFactory creation failed.", ex);   
  17. throw new ExceptionInInitializerError(ex);   
  18. }   
  19. }   
  20.  
  21. public static final ThreadLocal session = new ThreadLocal();   
  22.  
  23. public static Session currentSession() throws HibernateException {   
  24. Session s = (Session) session.get();   
  25. // Open a new Session, if this Thread has none yet   
  26. if (s == null) {   
  27. s = sessionFactory.openSession();   
  28. session.set(s);   
  29. }   
  30. return s;   
  31. }   
  32.  
  33. public static void closeSession() throws HibernateException {   
  34. Session s = (Session) session.get();   
  35. session.set(null);   
  36. if (s != null)   
  37. s.close();   
  38. }   
  39. }   

在同一个执行绪中,Session被暂存下来了,但无须担心数据库连结Connection持续占用问题,Hibernate会在真正需要数据库操作时才(从连接池中)取得Connection。

在Web应用程序中,我们可以藉助Filter来进行Session管理,在需要的时候开启Session,并在Request结束之后关闭Session,这个部份,在JavaWorld的Wiki上有个很好的例子:
http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=805
另外在Hibernate中文网上也有一篇介绍:
http://www.hibernate.org.cn/80.html


【编辑推荐】

  1. Hibernate性能优化全面剖析
  2. 对Hibernate中get()与load()不同点分析
  3. Struts-Spring-Hibernate案例
  4. 简述Hibernate配置连接池
  5. 对Hibernate中get()与load()不同点分析

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...