`
AutomaticThoughts
  • 浏览: 165583 次
社区版块
存档分类
最新评论

Hibernate---延迟加载和OpenSessionInView

 
阅读更多

Hibernate与延迟加载: Hibernate对象关系映射提供延迟的与非延迟的对象初始化。非延迟加载在读取一个对象的时候会将与这个对象所有相关的其他对象一起读取出来。这有时会导致成百的(如果不是成千的话) select 语句在读取对象的时候执行。这个问题有时出现在使用双向关系的时候,经常会导致整个数据库都在初始化的阶段被读出来了。当然,你可以不厌其烦地检查每一个对象与其他对象的关系,并把那些最昂贵的删除,但是到最后,我们可能会因此失去了本想在 ORM 工具中获得的便利。 
一个明显的解决方法是使用 Hibernate 提供的延迟加载机制。这种初始化策略只在一个对象调用它的一对多或多对多关系时才将关系对象读取出来。这个过程对开发者来说是透明的,而且只进行了很少的数据库操作请求,因此会得到比较明显的性能提升。这项技术的一个缺陷是延迟加载技术要求一个 Hibernate 会话要在对象使用的时候一直开着。这会成为通过使用 DAO 模式将持久层抽象出来时的一个主要问题。为了将持久化机制完全地抽象出来,所有的数据库逻辑,包括打开或关闭会话,都不能在应用层出现。最常见的是,一些实现了简单接口的 DAO 实现类将数据库逻辑完全封装起来了。一种快速但是笨拙的解决方法是放弃 DAO 模式,将数据库连接逻辑加到应用层中来。这可能对一些小的应用程序有效,但是在大的系统中,这是一个严重的设计缺陷,妨碍了系统的可扩展性。 
在 Web 层进行延迟加载 幸运的是, Spring 框架为 Hibernate 延迟加载与 DAO 模式的整合提供了一种方便的解决方法。对那些不熟悉 Spring 与 Hibernate 集成使用的人,我不会在这里讨论过多的细节,但是我建议你去了解 Hibernate 与 Spring 集成的数据访问。以一个 Web 应用为例, Spring 提供了 OpenSessionInViewFilter 和 OpenSessionInViewInterceptor 。我们可以随意选择一个类来实现相同的功能。两种方法唯一的不同就在于 interceptor 在 Spring 容器中运行并被配置在 web 应用的上下文中,而 Filter 在 Spring 之前运行并被配置在 web.xml 中。不管用哪个,他们都在请求将当前会话与当前(数据库)线程绑定时打开 Hibernate 会话。一旦已绑定到线程,这个打开了的 Hibernate 会话可以在 DAO 实现类中透明地使用。这个会话会为延迟加载数据库中值对象的视图保持打开状态。一旦这个逻辑视图完成了, Hibernate 会话会在 Filter 的 doFilter 方法或者 Interceptor 的 postHandle 方法中被关闭。下面是每个组件的配置示例:

Interceptor的配置: 

Java代码 
  1. <beans>  
  2. <bean id="urlMapping"  
  3. class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
  4. <property name="interceptors">  
  5. <list>  
  6. <ref bean="openSessionInViewInterceptor"/>  
  7. </list>  
  8. </property>  
  9. <property name="mappings">  
  10. ...  
  11. </bean>  
  12. ...  
  13. <bean name="openSessionInViewInterceptor"  
  14. class="org.springframework.orm.hibernate.support.OpenSessionInViewInterceptor">  
  15. <property name="sessionFactory"><ref bean="sessionFactory"/></property>  
  16. </bean>  
  17. </beans>  

Filter的配置 

Java代码 
  1. <web-app>  
  2. ...  
  3. <filter>  
  4. <filter-name>hibernateFilter</filter-name>  
  5. <filter-class>  
  6. org.springframework.orm.hibernate.support.OpenSessionInViewFilter  
  7. </filter-class>  
  8. </filter>  
  9. ...  
  10. <filter-mapping>  
  11. <filter-name>hibernateFilter</filter-name>  
  12. <url-pattern>*. spring </url-pattern>  
  13. </filter-mapping>  
  14. ...  
  15. </web-app>  

 


分享到:
评论

相关推荐

    Hibernate延迟加载以及利用Spring

    ### Hibernate延迟加载以及利用Spring #### 一、Hibernate延迟加载概念与原理 在理解Hibernate的延迟加载机制之前,我们首先需要了解什么是延迟加载。延迟加载(Lazy Loading)是一种设计模式,其核心思想是在真正...

    Struts Spring Hibernate 整合 OpenSessionInView 例子

    为了练手培训,给大家准备的 Open...3.通过 open session in view filter 支持 延迟加载 4.在页面上通过 jstl 很优雅的获取数据 5.通过 spring aop(aspectJ) 声明事务 6.通过formular 映射参数表,指定两个死的变量

    OpenSessionInView项目整合jar包

    OpenSessionInView模式确保在整个HTTP请求生命周期内,数据库操作都在一个开放的Hibernate Session中进行,从而避免了延迟加载时的数据丢失问题。 标题"OpenSessionInView项目整合jar包"指的是包含实现...

    hibernate面试题总结

    5. **延迟加载和OpenSessionInView**: - **延迟加载(Lazy Loading)**:默认情况下,关联的对象只在需要时才加载,以减少不必要的数据库交互,提高性能。 - **OpenSessionInView**:是一种设计模式,用于Web应用...

    struts+spring+hibernate面试题

    5. 延迟加载(Lazy Loading)和`openSessionInView`模式: - 延迟加载是在需要时才加载关联对象,确保只在session范围内加载,以提高性能。 - `openSessionInView`模式是在Web层使用Filter打开和关闭Session,确保...

    hibernate 中的lazy属性祥解.txt

    `lazy`属性是Hibernate框架中一个非常重要的特性,它通过延迟加载关联对象来优化数据加载过程,从而提升应用性能和资源利用率。然而,正确理解和合理使用`lazy`属性对于避免潜在的异常和性能瓶颈至关重要。通过本篇...

    struts+spring+hibernate面试题.doc

    Hibernate的延迟加载与OpenSessionInView - **延迟加载**:在session范围内,仅在实际需要时加载关联对象的数据,提高性能。 - **OpenSessionInView**:在Web层通过Filter保持session的打开状态,直到请求结束,...

    struts spring hibernate面试题

    Hibernate 的延迟加载与 openSessionInView - **延迟加载**:只在真正需要时才加载关联对象,以提高性能。 - **openSessionInView**:通过在 web 层设置一个 filter 来保持 session 打开状态,从而支持整个请求...

    struts+hibernate,spring面试题

    7. **Hibernate的延迟加载和openSessionInView**: 延迟加载意味着只有在需要时才加载数据,需要在Session范围内。`openSessionInView`过滤器确保每个HTTP请求都有一个开启的Session,以支持延迟加载。 8. **...

    hibernate优化

    对于对象关联实例,Hibernate默认使用延迟加载,而对于对象关联集合,可以通过fetch属性设置为"join"或"select"来决定加载方式。延迟加载可以减少不必要的数据传输,但需要注意在Session关闭前使用延迟加载的对象,...

    收集的struts+spring+hibernate面试题.doc

    Hibernate 的延迟加载和 openSessionInView 模式 - **延迟加载**:只在真正需要时才加载关联对象,从而提高应用程序性能。 - **openSessionInView**:通过在 Web 层添加一个 Filter 来维持 Session 的打开状态,...

    SSH面试题

    **问题:** 谈谈Hibernate的延迟加载和OpenSessionInView。 - **延迟加载**: 只在真正需要时才加载关联对象。这有助于提高性能,减少不必要的数据加载。 - **OpenSessionInView**: 通过Web层的Filter在一次请求周期...

    收集的struts+spring+hibernate面试题借鉴.pdf

    6. Hibernate的`load()`和`get()`方法的区别在于,`load()`假设数据一定存在于数据库中并返回代理对象,延迟加载直到实际使用属性时才查询数据库,如果数据不存在则抛出`ObjectNotFoundException`。而`get()`会首先...

    struts2+hirbate+spring面试题

    7. **Hibernate的延迟加载和OpenSessionInView** - **延迟加载**:在需要数据时才查询数据库,需在同一个Session作用域内。 - **OpenSessionInView**:通过过滤器保持Session在整个HTTP请求期间开启,确保延迟加载...

    Spring框架1

    6. **Hibernate的延迟加载和OpenSessionInView**: - **延迟加载**:在同一个`Session`范围内,只有当需要数据时才加载,以提高性能。 - **OpenSessionInView**:在Web层通过Filter保持`Session`在整个HTTP请求...

    java ssh 面试题

    Hibernate 的延迟加载和 openSessionInView - **延迟加载:** 这种技术允许在真正需要时才加载关联对象,从而减少内存消耗和提高性能。然而,延迟加载需要在一个活跃的 Session 内部才能正常工作。 - **...

    spring中lazy=“true”的正常读取关联表(用opensessioninview)

    在Spring框架中,`lazy="true"` 是一个重要的特性,用于延迟加载(Lazy Loading)。它主要应用于数据持久层,如Hibernate等ORM框架中,目的是为了提高应用的性能。当一个对象被标记为懒加载时,只有在真正需要访问该...

Global site tag (gtag.js) - Google Analytics