关于Webwork中OpenSessionInView的使用

阅读更多
1、说说为什么使用lazy
当使用Hibernate中的one-to-many、many-to one、many-to-many关系映射的时候,一个对象中会包含一个或多个Set来关联其他的对象。例如:user-groups,当程序取user对象时,如果一个用户有多个自定义组,那么程序将把组的信息也读取出来,在log中可以看到两个sql的输出。但是在页面的显示上,也许并不需要显示这个用户相关组的信息,这样系统的消耗就白白浪费了,于是hibernate提供了lazy(延迟加载)的方法来避免这一情况的发生,我们只需要在user.hbm.xml中设置lazy=true,就能实现延迟加载。

            
                
            
            
                
            
        


2、说说为什么使用OpenSessionInView
当hibernate+spring配合使用的时候,如果设置了lazy=true,那么在读取数据的时候,当读取了父数据后,hibernate会自动关闭session,这样,当要使用子数据的时候,系统会抛出lazyinit的错误,这时就需要使用spring提供的OpenSessionInViewFilter,
OpenSessionInViewFilter主要是保持Session状态知道request将全部页面发送到客户端,这样就可以解决延迟加载带来的问题

3、说说Webwork中使用OpenSessionInView的注意事项
web.xml中的配置要注意先后顺序,OpenSessionInViewFilter要在Webwork的filter前面,否则系统会报错。

		opensession
		
			org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
		
		
			singleSession
			true
		
		
			sessionFactoryBeanName
			mySessionFactory 
		
	
	 
	
	    webwork
	    com.opensymphony.webwork.dispatcher.FilterDispatcher
	
         
	  opensession
	  /* 
	
	
	    webwork
	    /*
	


对于OpenSessionInView的配置中,singleSession应该设置为true,表示一个request只能打开一个session,如果设置为false的话,session可以被打开多个,这时在update、delete的时候会出现打开多个session的异常。

但是当设置为true的时候,系统的性能会因为用户的网络状况受到影响,当request在生成页面完成后,session才会被释放,所以如果用户的网络状况比较差,那么连接池中的链接会迟迟不被回收,造成内存增加,系统性能受损。但是如果不用这种方法的话,lazy模式有体现不出他的有点,用?不用?两难啊

你可能感兴趣的:(Webwork,Hibernate,Spring,SQL,XML)