Hibernate懒加载异常的解决与深刻分析

出现原因:

Hibernate允许对关联对象及属性延迟加载,前提是这个操作在同一个Hibernate
session范围内进行.如果发生这样的情况,当service层返回了一个启用延迟加载功能的domain对象给web层,而web层访问到这些需要延迟加载的对象或属性时,由于加载domain对象的session已经关闭导致无法访问,就会出现访问异常.

解决方法:

我们可以使用一个过滤器,在web请求时给它绑定一个Hibernatesession,这样就可以保证整个请求的过程中session都是开启的,可以进行延迟加载的操作.

Spring就提供了这个过滤器----OpenSessionInViewFilter,它把Hibernate
session绑定到请求线程中,session将自动被Spring的事务管理器管理.即使Service层的事务完成,session也会开启以支持延迟加载操作.

具体做法就是在web.xml中配置这个过滤器:

<filter>
	<filter-name>OpenSessionInViewFilter</filter-name>      <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
 </filter>
<filter-mapping>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <url-pattern>*.action</url-pattern>
</filter-mapping>

该解决方法的优缺点:

举个现实工程中的例子:

如果User和Department是多对一的实体关联关系,我们要在页面中显示user的信息,user中的Department使用懒加载.

使用OpenSessionInViewFilter,service层提供一个queryUser()方法就可以搞定,懒加载会自动在web层发起调用时触发.使用filter的感觉倍儿爽,轻轻松松实现了想用就查不用不查的效果,若项目不大的话,service层代码又好开发好维护.

让我们来想一想会不会有性能问题.如果项目偏大又有高并发,这么做就显得不那么爽了.为什么呢?每一个web请求都会绑定一个Hibernate
session,所有的请求都绑定session后,就意味着所有的请求都会占用一个数据连接,直到请求处理完成后!也就是说web请求对数据连接的占用会比原来长很多,甚至有的web请求根本不需要使用数据连接,这种对数据连接资源访问的并发性更会出现性能瓶颈.因为我们的瓶颈多是出现在数据库上啊~

有什么好的解决方案吗?

有啊,让需要连接数据库的请求绑定session,不需要的不绑定就得了嘛,是,只是在过滤器前面加过滤器的技术我还不太会.

说个能实现的吧,就是不用OpenSessionInViewFilter了.那懒加载异常怎么解决啊?我们换个思路,把懒加载的事在service内完成,不让它跨出service到web层了.这就要在service层设计好多元的接口,还从上面的例子说,我在service层写两个接口,一个叫getUserWithDepartment(),一个叫getUserWithoutDepartment().

ITOO项目经验总结:

ITOO中并没有使用Hibernate的懒加载,当时不必要的关联查询导致系统显示缓慢是靠优化sql语句解决的.为什么我们没用懒加载这么好的东东?因为我们的延迟加载操作完全超出了Hibernate
session的范围,一个是EJB容器中的session,一个是Spring中的Hibernate
session,超出范围当然就用不了啦.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-24 20:13:35

Hibernate懒加载异常的解决与深刻分析的相关文章

Hibernate懒加载异常解决方案总结

[什么是Hibernate懒加载异常] 我们所说的懒加载也被称为延迟加载,它在查询的时候不会立刻访问数据库,而是返回代理对象,当真正去使用对象的时候才会访问数据库,可以有效的降低数据库访问次数和内存使用量.懒加载为Hibernate中比较常用的特性之一,Hibernate 通过默认采取懒加载机制来降低系统的内存开销,提高系统性能.但这也使很多初学者使用Hibernate时容易出现懒加载异常. [出现懒加载异常的原因] 这个异常出现的原因主要是使用懒加载机制加载数据时,hibernate在从数据库

Hibernate懒加载异常说明及其解决方法

在集成ssh2三大框架的时候很容易就会造成懒加载异常,通常显示的错误信息是: org.hibernate.LazyInitializationException: could not initialize proxy - no Session 懒加载异常出现的原因: 我们在Action中调用Service中的方法,方法中开始时open session,当调用结束后close session,例如类User中有一个Department属性,我们使用Hibernate查询一个User时,hibern

懒加载异常的解决

<filter> <!-- 平时使用懒加载时,有可能会因为hibernate的session(或着jpa的EntityManager)在事务结束时的关闭,导致页面调用数据时,出现懒加载异常 可以这样配置解决懒加载异常,让session在页面上也能使用, 但会使session打开的时间稍微长一点,并发量大时会使性能有所下降,但一般的项目没问题 --> <filter-name>OpenSessionInViewFilter</filter-name> <

在web.xml中添加配置解决hibernate 懒加载异常

在web.xml添加如下,注意:在配置在struts2的拦截器之前 <!-- 配置Spring的用于解决懒加载问题的过滤器 --> <filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class&g

SSH中懒加载异常的解决办法

web.xml 的配置文件 <!-- 配置Spring解决懒加载问题的过滤器 --> <filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter> <

系统管理模块_部门管理_设计(映射)本模块中的所有实体并总结设计实体的技巧_懒加载异常问题_树状结构

系统管理模块_部门管理_设计本模块中的所有实体并总结设计实体的技巧 设计实体流程 1,有几个实体? 一般是一组增删改查对应一个实体. 2,实体之间有什么关系? 一般是页面引用了其他的实体时,就表示与这个实体有关联关系. 3,每个实体中都有什么属性? 1,主键.推荐使用代理主键 2,关联关系属性.在类图中,关联关系是一条线,有两端,每一端对应一个表达此关联关系的属性.有几个端指向本类,本类中就有几个关联关系属性. 3,一般属性.分析所有有关的页面,找出表单中要填写的或是在显示页面中要显示的信息等.

懒加载异常 org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role

@OneToMany(cascade={CascadeType.REFRESH,CascadeType.REMOVE},mappedBy="parent",fetch=FetchType.EAGER) private Set<ProductType> childTypes = new HashSet<ProductType>(); 这个是懒加载异常,就是在查询时没有加载关联表的对象,你读取这个关联对象的时候,hibernate的session已经关闭,所以无法获

Hibernate的懒加载session丢失解决方法

在web.xml加入spring提供的过滤器,延长session的生命周期 <!--Hibernate的懒加载session丢失解决方法 --> <filter> <filter-name>openSessionInView</filter-name> <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class&

(11)Hibernate懒加载

1.get.load方法区别? get: 及时加载,只要调用get方法立刻向数据库查询 load:默认使用懒加载,当用到数据的时候才向数据库查询. 2.懒加载(lazy) 2.1.概念 概念:当用到数据的时候才向数据库查询,这就是hibernate的懒加载特性. 目的:提升程序执行效率! 2.2.lazy属性的值 在Hibernate中,懒加载对应lazy属性的值. lazy属性的值 序号 值 含义 1 true 使用懒加载 2 false 关闭懒加载 3 extra 在集合属性(配置当中使用s