轻松理解Hibernate Session管理入门

开发 后端
Hibernate Session是由SessionFactory所创建,SessionFactory是执行绪安全的(Thread-Safe),您可以让多个执行绪同时存取SessionFactory而不会有数据共享的问题。

本文就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()不同点分析
责任编辑:仲衡 来源: 360doc
相关推荐

2011-04-13 09:53:20

2024-07-31 15:39:00

2009-09-24 17:24:20

Hibernate S

2009-09-29 16:04:29

Hibernate S

2010-06-21 13:43:46

2009-09-25 13:51:13

Hibernate S

2009-09-23 17:18:16

Hibernate S

2009-09-25 09:46:03

Hibernate s

2009-09-23 17:03:08

Hibernate S

2009-09-25 10:53:40

Hibernate S

2009-09-22 10:09:21

Hibernate S

2015-03-02 15:56:36

2011-02-24 15:04:00

PostgreSQL数据库psql

2011-03-24 14:40:29

PostgreSQL数管理

2009-06-26 16:33:09

saveOrUpdatHibernate

2009-06-26 16:34:50

delete()方法Hibernate S

2009-06-12 16:00:13

Session方法Hibernate

2009-09-23 14:23:51

Hibernate主键

2009-09-24 09:44:32

Hibernate j

2009-09-27 14:53:38

Hibernate S
点赞
收藏

51CTO技术栈公众号