Session was closed解决方案

常培
2023-12-01

郁闷两天的事情今天终于被解决了。弄了个example示例查询,组合

Requisition(申请表单)属性和Ratify(领导审批)属性查询。每次查询几

次就会出现问题。特别是组合没有的实例时就会 浏览器就停在那走不动了,

其它的页面有关查询数据库的也查询不到,表现为客户端浏览器不动。
在myeclipse中有个错误:
 java.net.SocketException:   Software   caused   connection  

abort:   socket   write   error  
后来baidu,google都没有找出解决的办法
后来仔细才发现,都是查询了7次后,hibernate就死吊了。

后来又搞了2天,换了spring中的findByExample(object examplentity)进行

查询,可是连结果都没有查出来。查了1,2次后就报错,如下:
could not initialize proxy - the owning Session was closed
在网上找啊找,黄天不付有心人啊。终于让我找到原因了。
由于hibernate采用了lazy=true,这样当你用hibernate查询时,返回实际为利

用cglib增强的代理类,但其并没有实际填充;当你在前端,利用它来取值

(getXXX)时,这时Hibernate才会到数据库执行查询,并填充对象,但此时如果

和这个代理类相关的session已关闭掉,就会产生种错误.
在做一对多时,有时会出现"could not initialize proxy - clothe owning

Session was sed,这个好像是hibernate的缓存问题.问题解决:需要在<many

-to-one>里设置lazy="false". 但有可能会引发另一个异常叫
failed to lazily initialize a collection of role: XXXXXXXX, no

session or session was closed

解决方法:在web.xml中加入
<filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>
    

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

参考链接如下:
http://lz726.javaeye.com/blog/116616

参考了:
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的配置:


<beans>
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapp

ing">
<property name="interceptors">
<list>
<ref bean="openSessionInViewInterceptor"/>
</list>
</property>
<property name="mappings">

</bean>

<bean name="openSessionInViewInterceptor"
class="org.springframework.orm.hibernate.support.OpenSessionInViewI

nterceptor">
<property name="sessionFactory"><ref

bean="sessionFactory"/></property>
</bean>
</beans>

Filter的配置


<web-app>

<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate.support.OpenSessionInViewFilter
</filter-class>
</filter>

<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*. spring </url-pattern>
</filter-mapping>

</web-app>


 

 类似资料: