1. 程式人生 > >過濾器filter處理no session 懶載入異常

過濾器filter處理no session 懶載入異常

在專案練習的時候,遇到了這個懶載入異常,當時解決的方法是在配置檔案中設定lazy=“false”。該方法有很到缺點,效率極低,我們將所有相關聯的資料都查詢了,頻繁的查詢降低了效率!!不建議採用

懶載入是什麼:
hibernate懶載入也叫延遲載入,是Hibernate3關聯關係物件預設的載入方式,所謂延遲載入就是當在真正需要資料的時候,才真正執行資料載入操作。簡單理解為,只有在使用的時候,才會發出sql語句進行查詢。 延遲載入機制是為了避免一些無謂的效能開銷而提出來的,在Hibernate中提供了對實體物件的延遲載入以及對集合的延遲載入,另外在Hibernate3中還提供了對屬性的延遲載入。(延遲載入是hibernate的一種機制,主要是解決不必要的查詢對資源的浪費,只有當資料真正呼叫時才載入,而不會對資料進行提前載入造成資源的浪費)。
load()方法就是延遲載入,延遲載入的有效期是在session開啟的情況下,當session關閉後,會報異常。當呼叫load方法載入物件時,返回代理物件,等到真正用到物件的內容時才發出sql語句。
但是效率低。

Web程式中的懶載入異常說明

當一個請求來了之後,先執行Action,在執行結果。在action裡面有Service業務層,呼叫Service,Service做業務處理。

開始執行Service方法的時候,開始開啟事務和Session,Service方法結束或回滾提交事務,會自動關閉Session。

在Service裡面查詢列表載入物件的時候,但是其相關連的物件並沒有載入,但是Session關閉了,關聯物件最終沒有載入,在頁面中用到了懶載入屬性,但是是在之前載入的,且Session已經關閉了,所以有了懶載入異常,說沒有Session。

連結:https://www.jianshu.com/p/1a8343292c4a

解決辦法:加OpenSessionInViewFilter過濾器,過濾的是jsp檔案,不是servlet

解決方案

web.xml中

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>s69-spring-05</display-name>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
    <servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    <filter>
        <filter-name>openSessionInView</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>openSessionInView</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
<!-- 過濾的是jsp檔案,過濾servlet檔案沒有用  --!>

</web-app>

原理