<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    e代劍客——溫柔一刀

    生活就像海洋,只有意志堅強(qiáng)的人,才能到達(dá)彼岸

       :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      76 隨筆 :: 7 文章 :: 215 評論 :: 0 Trackbacks
    Spring+Hibernate中OpenSessionInView模式運(yùn)用 ?中會在Update Domain Object時遇到
    org.springframework.dao.InvalidDataAccessApiUsageException:?Write?operations?are?not?allowed?in?read-only?mode?(FlushMode.NEVER)?-?turn?your?Session?into?FlushMode.AUTO?or?remove?'readOnly'?marker?from?transaction?definition
    異常問題,這個Exception在尚未進(jìn)入DAO時就會遇到,是一個會發(fā)生在Modify Domain Object時的問題。

    可能的解決方式有:
    1、將singleSession設(shè)為false,這樣只要改web.xml,缺點(diǎn)是Hibernate Session的Instance可能會大增,使用的JDBC Connection量也會大增,如果Connection Pool的maxPoolSize設(shè)得太小,很容易就出問題。
    2、在控制器中自行管理Session的FlushMode,麻煩的是每個有Modify的Method都要多幾行程式。
    session.setFlushMode(FlushMode.AUTO);?
    ??session.update(user);?
    ??session.flush();?
    3、Extend OpenSessionInViewFilter,Override protected Session getSession(SessionFactory sessionFactory),將FlushMode直接改為Auto。
    4、讓方法受Spring的事務(wù)控制。

    下面著重解說第4種方式:

    OpenSessionInViewFilter里的幾個方法:

    protected?void?doFilterInternal(HttpServletRequest?request,?
    HttpServletResponse?response,FilterChain?filterChain)?
    throws?ServletException,?IOException?{?
     SessionFactory?sessionFactory?
    =?lookupSessionFactory();?
     logger.debug(
    "Opening?Hibernate?Session?in?OpenSessionInViewFilter");?
     Session?session?
    =?getSession(sessionFactory); TransactionSynchronizationManager.bindResource(?
      sessionFactory,?
    new?SessionHolder(session));?
     
    try?{?
      filterChain.doFilter(request,?response); ?
    ??}
     finally?{?
     TransactionSynchronizationManager.unbindResource(sessionFactory);?
     logger.debug(
    "Closing?Hibernate?Session?in?OpenSessionInViewFilter"); ?
    ??closeSession(session,?sessionFactory); ?
    ??}
    ?
    }
    ?

    protected?Session?getSession(SessionFactory?sessionFactory)?
    throws?DataAccessResourceFailureException?{?
     Session?session?
    =?SessionFactoryUtils.getSession(sessionFactory,?true);?
     session.setFlushMode(FlushMode.NEVER);?
     
    return?session;?
    }
    ?
    protected?void?closeSession(Session?session,?SessionFactory?sessionFactory)?
    throws?CleanupFailureDataAccessException?{ ??
    ??SessionFactoryUtils.closeSessionIfNecessary(session,?sessionFactory);?
    }
    ?

    可以看到OpenSessionInViewFilter在getSession的時候,會把獲取回來的session的flush mode 設(shè)為FlushMode.NEVER。然后把該sessionFactory綁定到TransactionSynchronizationManager,使request的整個過程都使用同一個session,在請求過后再解除該sessionFactory的綁定,最后closeSessionIfNecessary根據(jù)該session是否已和transaction綁定來決定是否關(guān)閉session。在這個過程中,若HibernateTemplate 發(fā)現(xiàn)自當(dāng)前session有不是readOnly的transaction,就會獲取到FlushMode.AUTO Session,使方法擁有寫權(quán)限:

    public?static?void?closeSessionIfNecessary(Session?session,?SessionFactory?sessionFactory)??????throws?CleanupFailureDataAccessException?{?
    ????
    if?(session?==?null?||?TransactionSynchronizationManager.hasResource(sessionFactory)){?
    ??????
    return;????
    }
    ?
    ????logger.debug(
    "Closing?Hibernate?session");?
    ????
    try?{?
    ??????session.close();?
    ????}
    ?
    ????
    catch?(JDBCException?ex)?{?
    ??????

    ?????throw?new?CleanupFailureDataAccessException("Could?not?close?Hibernate?session",?ex.getSQLException());?
    ????}
    ????catch?(HibernateException?ex)?{?
    ??????
    throw?new?CleanupFailureDataAccessException("Could?not?close?Hibernate?session",?ex);?
    ????}
    ?
    }
    ?

    如果有不是readOnly的transaction就可以由Flush.NEVER轉(zhuǎn)為Flush.AUTO,擁有insert,update,delete操作權(quán)限,如果沒有transaction,并且沒有另外人為地設(shè)flush model的話,則doFilter的整個過程都是Flush.NEVER。所以受transaction保護(hù)的方法有寫權(quán)限,沒受保護(hù)的則沒有。

    采用spring的事務(wù)聲明,使方法受transaction控制:

    <bean?id="manager"?class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    ????????
    <property?name="proxyInterfaces">
    ????????????
    <list>
    ????????????????
    <value>com.zhupan.service.IManager</value>
    ????????????
    </list>
    ????????
    </property>
    ????????
    <property?name="transactionManager">
    ????????????
    <ref?bean="transactionManager"?/>
    ????????
    </property>
    ????????
    <property?name="target">
    ????????????
    <ref?local="managerTarget"?/>
    ????????
    </property>
    ????????
    <property?name="transactionAttributes">
    ????????????
    <props>????????????????????????????
    ????????????????
    <prop?key="*Insert">PROPAGATION_REQUIRED</prop>
    ????????????????
    <prop?key="*Update">PROPAGATION_REQUIRED</prop>
    ????????????????
    <prop?key="*Get*">PROPAGATION_REQUIRED,readOnly</prop>????
    ????????????????
    <prop?key="*List*">PROPAGATION_REQUIRED,readOnly</prop>????????????
    ????????????
    </props>
    ????????
    </property>
    ????
    </bean>

    對于上面的,以Insert,Update結(jié)尾的方法擁有可寫的事務(wù),如果某個方法,如方法名為savaSort(),則沒有寫權(quán)限,這時若此方法內(nèi)有insert,update,delete操作的話,則需要手動設(shè)置flush model為Flush.AUTO,如:

    session.setFlushMode(FlushMode.AUTO);?
    ??session.update(user);?
    ??session.flush();?

    posted on 2006-10-15 15:04 溫柔一刀 閱讀(2418) 評論(2)  編輯  收藏 所屬分類: 開源框架

    評論

    # re: 使用OpenSessionInView模式時的一個異常問題解決方法 2006-10-18 15:18 123bingbing
    增開7群,號碼 30440732
    8群 30756649
    9群 30178567
    10群 28694497

    我們的qq群:15096318 學(xué)習(xí)程序的都可以來
      回復(fù)  更多評論
      

    # re: 使用OpenSessionInView模式時的一個異常問題解決方法 2006-10-18 15:43 人上車
    @123bingbing
    這也可以打廣告啊?  回復(fù)  更多評論
      

    聯(lián)系偶 zhupanjava@gmail.com 溫柔一刀
    主站蜘蛛池模板: 亚洲成人黄色网址| 亚洲av永久无码精品古装片| 亚洲综合色区中文字幕| 一级成人a毛片免费播放| 久久国产亚洲精品麻豆| 成全视频免费观看在线看| 亚洲av永久无码精品古装片| 免费国产叼嘿视频大全网站| 亚洲AV无码专区国产乱码电影| 久久久精品免费视频| 久久久无码精品亚洲日韩蜜臀浪潮 | 久久综合国产乱子伦精品免费| 亚洲色av性色在线观无码| 最近2019免费中文字幕视频三| 亚洲欧洲自拍拍偷综合| 国产一卡2卡3卡4卡2021免费观看| 国产精品亚洲综合五月天| 四虎免费永久在线播放| 九九九国产精品成人免费视频| 亚洲精品一品区二品区三品区| 最近中文字幕大全免费视频| 波多野结衣亚洲一级| 免费A级毛片在线播放不收费| 一级做a爰性色毛片免费| 无码专区—VA亚洲V天堂| 在线v片免费观看视频| 婷婷国产偷v国产偷v亚洲| 国产亚洲AV夜间福利香蕉149| 无码av免费一区二区三区| 亚洲一卡2卡3卡4卡乱码 在线| 又粗又硬免费毛片| 免费成人在线电影| 伊人久久亚洲综合影院首页| 久久久久亚洲AV成人网人人网站 | 韩国免费一级成人毛片| 亚洲AV永久无码天堂影院| 中文字幕亚洲无线码| 免费大片黄在线观看yw| 午夜不卡AV免费| 亚洲六月丁香六月婷婷蜜芽| 免费精品国产自产拍观看|