Spring配置之OpenSessionInViewFilter
參考:
OpenSessionInViewFilter作用及配置:http://www.yybean.com/opensessioninviewfilter-role-and-configuration
http://blog.csdn.net/fooe84/article/details/680449
主要涉及類:
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor
一、作用
說明一下Open Session in View的作用,就是允許在每次的整個request的過程中使用同一個hibernate session,可以在這個request任何時期lazy loading資料。
如果是singleSession=false的話,就不會在每次的整個request的過程中使用同一個hibernate session,而是每個資料訪問都會產生各自的seesion,等於沒有Open Session in View.
OpenSessionInViewFilter預設是不會對session 進行flush的,並且flush mode 是 never
spring的OpenSessionInViewFilter過濾器,主要是為了實現Hibernate的延遲載入功能,基於一個請求一個hibernate session的原則。
二、配置
它有兩種配置方式OpenSessionInViewInterceptor和OpenSessionInViewFilter(具體參看SpringSide),功能相同,只是一個在web.xml配置,另一個在application.xml配置而已。
Open Session In View在request把session繫結到當前thread期間一直保持hibernate session在open狀態,使session在request的整個期間都可以使用,如在View層裡PO也可以lazy loading資料,如 ${ company.employees }。當View 層邏輯完成後,才會通過Filter的doFilter方法或Interceptor的postHandle方法自動關閉session。
1,web.xml配置OpenSessionInViewFilter
2,applicationContext.xml配置openSessionInViewInterceptor
三、注意
盡 管Open Session In View看起來還不錯,其實副作用不少。看回上面OpenSessionInViewFilter的doFilterInternal方法程式碼,這個方法實際上是被父類的doFilter呼叫的,因此,我們可以大約瞭解的OpenSessionInViewFilter呼叫流程:
request(請求)->open session並開始transaction->controller->View(Jsp)->結束transaction並 close session.
一切看起來很正確,尤其是在本地開發測試的時候沒出現問題,但試想下如果流程中的某一步被阻塞的話,那在這期間connection就一直被佔用而不釋放。最有可能被阻塞的就是在寫Jsp這步,一方面可能是頁面內容大,response.write的時間長,另一方面可能是網速慢,伺服器與使用者間傳輸時間久。當大量這樣的情況出現時,就有連線池連線不足,造成頁面假死現象。
Open Session In View是個雙刃劍,放在公網上內容多流量大的網站請慎用
OpenSessionInViewFilter作用及配置:http://www.yybean.com/opensessioninviewfilter-role-and-configuration
http://blog.csdn.net/fooe84/article/details/680449
主要涉及類:
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor
一、作用
說明一下Open Session in View的作用,就是允許在每次的整個request的過程中使用同一個hibernate session,可以在這個request任何時期lazy loading資料。
如果是singleSession=false的話,就不會在每次的整個request的過程中使用同一個hibernate session,而是每個資料訪問都會產生各自的seesion,等於沒有Open Session in View.
OpenSessionInViewFilter預設是不會對session 進行flush的,並且flush mode 是 never
spring的OpenSessionInViewFilter過濾器,主要是為了實現Hibernate的延遲載入功能,基於一個請求一個hibernate session的原則。
二、配置
它有兩種配置方式OpenSessionInViewInterceptor和OpenSessionInViewFilter(具體參看SpringSide),功能相同,只是一個在web.xml配置,另一個在application.xml配置而已。
Open Session In View在request把session繫結到當前thread期間一直保持hibernate session在open狀態,使session在request的整個期間都可以使用,如在View層裡PO也可以lazy loading資料,如 ${ company.employees }。當View 層邏輯完成後,才會通過Filter的doFilter方法或Interceptor的postHandle方法自動關閉session。
1,web.xml配置OpenSessionInViewFilter
- <!--Hibernate Open Session in View Filte-->
- <filter>
- <filter-name>hibernateFilter</filter-name>
- <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
- <!-- singleSession預設為true,若設為false則等於沒用OpenSessionInView -->
- <init-param>
- <param-name>singleSession</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>hibernateFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
2,applicationContext.xml配置openSessionInViewInterceptor
- <bean id="openSessionInViewInterceptor"
- class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
三、注意
盡 管Open Session In View看起來還不錯,其實副作用不少。看回上面OpenSessionInViewFilter的doFilterInternal方法程式碼,這個方法實際上是被父類的doFilter呼叫的,因此,我們可以大約瞭解的OpenSessionInViewFilter呼叫流程:
request(請求)->open session並開始transaction->controller->View(Jsp)->結束transaction並 close session.
一切看起來很正確,尤其是在本地開發測試的時候沒出現問題,但試想下如果流程中的某一步被阻塞的話,那在這期間connection就一直被佔用而不釋放。最有可能被阻塞的就是在寫Jsp這步,一方面可能是頁面內容大,response.write的時間長,另一方面可能是網速慢,伺服器與使用者間傳輸時間久。當大量這樣的情況出現時,就有連線池連線不足,造成頁面假死現象。
Open Session In View是個雙刃劍,放在公網上內容多流量大的網站請慎用
相關文章
- OpenSessionInViewFilterSessionViewFilter
- Spring Boot 自動配置之條件註解Spring Boot
- Spring Boot 自動配置之@EnableAutoConfigurationSpring Boot
- Spring Boot 自動配置之組合註解Spring Boot
- Spring Boot 基本配置之依賴管理starter pomSpring Boot
- spring裝配Spring
- 請教:OpenSessionInViewFilter配置使用問題SessionViewFilter
- Spring Boot 自動配置之@Enable* 與@Import註解Spring BootImport
- Spring bean 裝配SpringBean
- Spring Bean裝配SpringBean
- Spring – 裝配BeanSpringBean
- Spring零配置之@Configuration註解詳解Spring
- 二、Spring裝配BeanSpringBean
- Spring裝配Bean(四)SpringBean
- Spring MVC 基本配製SpringMVC
- Spring裝配Bean(一)SpringBean
- Spring裝配Bean(二)SpringBean
- Spring - 高階裝配Spring
- Spring – 高階裝配Spring
- Spring IOC 一——Spring容器裝配BeanSpringBean
- Spring自動裝配BeansSpringBean
- 自動裝配【Spring autowire】Spring
- Spring 自動裝配AutoWireSpring
- Spring實戰:裝配bean-自動化裝配beanSpringBean
- Spring Boot 自動裝配原理Spring Boot
- Spring IOC容器-自動裝配Spring
- Spring裝配Bean(七) Spring的執行時注入SpringBean
- 2、spring注入及自動裝配Spring
- 初識Spring —— Bean的裝配(二)SpringBean
- 初識Spring —— Bean的裝配(一)SpringBean
- 《nginx 配置之——domain 轉 path》NginxAI
- 持續整合配置之Nuget
- webpack配置之後端渲染Web後端
- Spring Framework 條件裝配 之 @ConditionalSpringFramework
- Spring-04 Bean的自動裝配SpringBean
- Spring裝配Bean(六)Bean的作用域SpringBean
- 記錄Mybatis的配置之謎MyBatis
- Spring入門(二):自動化裝配beanSpringBean