国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Spring?的OpenSessionInViewFilter簡介
假設(shè)在你的應(yīng)用中Hibernate是通過spring 來管理它的session.如果在你的應(yīng)用中沒有使用OpenSessionInViewFilter或者 OpenSessionInViewInterceptor。session會在transaction結(jié)束后關(guān)閉。
如果你采用了spring的聲明式事務(wù)模式,它會對你的被代理對象的每一個方法進(jìn)行事務(wù)包裝(AOP的方式)。

<bean id="txProxyTemplate" abstract="true"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager" ref="transactionManager"/>
        <property name="transactionAttributes">
            <props>
                <prop key="save*">PROPAGATION_REQUIRED</prop>
                <prop key="remove*">PROPAGATION_REQUIRED</prop>
                <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
            </props>
        </property>
    </bean>

    <bean id="manager" parent="txProxyTemplate">
        <property name="target">
            <bean class="org.appfuse.service.impl.BaseManager">
                <property name="dao" ref="dao"/>
            </bean>
        </property>
    </bean>
目標(biāo)類org.appfuse.service.impl.BaseManager 的 save *方法的事務(wù)類型PROPAGATION_REQUIRED ,remove* 方法的事務(wù)類型PROPAGATION_REQUIRED,其他的方法的事務(wù)類型是PROPAGATION_REQUIRED,readOnly。
所以給你的感覺是調(diào)用這個名為“manager”的bean的方法之后session就關(guān)掉了。
如果應(yīng)用中使用了OpenSessionInViewFilter或者OpenSessionInViewInterceptor,所有打開的session會被保存在一個線程變量里。在線程退出前通過
OpenSessionInViewFilter或者OpenSessionInViewInterceptor斷開這些session。為什么這么做?這主要是為了實現(xiàn)Hibernate的延遲加載功能。基于一個請求一個hibernate session的原則。

spring中對OpenSessionInViewFilter的描述如下:
     它是一個Servlet2.3過濾器,用來把一個Hibernate Session和一次完整的請求過程對應(yīng)的線程相綁定。目的是為了實現(xiàn)"Open Session in View"的模式。
例如: 它允許在事務(wù)提交之后延遲加載顯示所需要的對象。

這個過濾器和 HibernateInterceptor 有點類似:它是通過線程實現(xiàn)的。無論是沒有事務(wù)的應(yīng)用,還是有業(yè)務(wù)層事務(wù)的應(yīng)用(通過HibernateTransactionManager 或JtaTransactionManager的方式實現(xiàn))它都適用。在后一種情況下,事務(wù)會自動采用由這個filter綁定的Session來進(jìn)行相關(guān)的操作以及根據(jù)實際情況完成提交操作。

    警告:如果在你的應(yīng)用中,一次請求的過程中使用了單一的一個HIbernate Session,在這種情況下,采用這個filter會產(chǎn)生一些以前沒遇到的問題。特別需要注意的是通過Hibernate Session重新組織持久化對象之間關(guān)系的相關(guān)操作需要在請求的最開始進(jìn)行。以免與已經(jīng)加載的相同對象發(fā)生沖突。

    或者,我們可以通過指定"singleSession"="false"的方式把這個過濾器調(diào)到延期關(guān)閉模式。這樣在一次請求的過程中不會使用一個單一的Session.每一次數(shù)據(jù)訪問或事務(wù)相關(guān)
操作都使用屬于它自己的session(有點像不使用Open Session in View).這些session都被注冊成延遲關(guān)閉模式,即使是在這一次的請求中它相關(guān)操作已經(jīng)完成。

     "一次請求一個session" 對于一級緩存而言很有效,但是這樣可以帶來副作用。例如在saveOrUpdate的時候或事物回滾之后,雖然它和“no Open Session in View”同樣安全。
但是它卻允許延遲加載。

    它會在spring的web應(yīng)用的上下文根中查找Session工廠。它也支持通過在web.xml中定義的“SessionFactoryBeanName”的init-param元素指定的Session工廠對應(yīng)的bean的名字來查找session工廠。默認(rèn)的bean的名字是"sessionFactory".他通過每一次請求查找一次SessionFactory的方式來避免由初始化順序引起的問題(當(dāng)使用ContextLoaderServlet來集成spring的時候,spring 的應(yīng)用上下文是在這個filter 之后才被初始化的)。
默認(rèn)的情況下,這個filter 不會同步Hibernate Session.這是因為它認(rèn)為這項工作是通過業(yè)務(wù)層的事務(wù)來完成的。而且HibernateAccessors 的FlushMode為FLUSH_EAGER.如果你
想讓這個filter在請求完成以后同步session.你需要覆蓋它的closeSession方法,在這個方法中在調(diào)用父類的關(guān)閉session操作之前同步session.此外你需要覆蓋它的getSession()
方法。返回一個session它的FlushMode 不是默認(rèn)的FlushMode.NEVER。需要注意的是getSession()和closeSession()方法只有在single session的模式中才被調(diào)用。

在myfaces的wiki里提供了OpenSessionInViewFilter的一個子類如下:
public class OpenSessionInViewFilter extends org.springframework.orm.hibernate3.support.OpenSessionInViewFilter {
      
       
        protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException {
                Session session = SessionFactoryUtils.getSession(sessionFactory, true);
                session.setFlushMode(FlushMode.COMMIT);
                return session;
        }
       
        protected void closeSession(Session session, SessionFactory factory) {
                session.flush();
                super.closeSession(session, factory);
        }
}

<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>/*</url-pattern>
</filter-mapping>
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
關(guān)于OpenSessionInView
hibernate exception 報錯 異?!局攸c】【總結(jié)】
關(guān)于OpenSessionInViewFilter
spring+hibernate多數(shù)據(jù)源+動態(tài)切換 事宜 lazyload一應(yīng)俱全
spring?管理Session及處理懶加載(延時加載)問題
spring4.x + hibernate4.x 配置詳解
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服