隨筆 - 31  文章 - 2  trackbacks - 0
          由于OpenSessionInViewFilter把session綁在當(dāng)前線程上,導(dǎo)致session的生命周期比事務(wù)要長(zhǎng),這期間所有事務(wù)性操作都在復(fù)用這同一個(gè)session,由此產(chǎn)生了一些“怪問(wèn)題”:
          1.出現(xiàn)如下錯(cuò)誤
          ???? 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?
          ? 分析原因:OpenSessionInViewFilter在把session綁在當(dāng)前線程上的時(shí)候,會(huì)把session的flush mode 設(shè)為FlushMode.NEVER,因此,如果某個(gè)方法沒(méi)有事務(wù)或者有只讀事務(wù),則不能對(duì)session做insert,update,delete操作,除非事先把session的flush mode手動(dòng)設(shè)為auto
          方案:
          1、將singleSession設(shè)為false,這樣只要改web.xml,缺點(diǎn)是Hibernate Session的Instance可能會(huì)大增,使用的JDBC Connection量也會(huì)大增,如果Connection Pool的maxPoolSize設(shè)得太小,很容易就出問(wèn)題。<!-- singleSession默認(rèn)為true,若設(shè)為false則等于沒(méi)用OpenSessionInView -->
          2、在控制器中自行管理Session的FlushMode,麻煩的是每個(gè)有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ù)控制(service和配置文件對(duì)應(yīng))
          posted on 2007-11-02 17:12 緣來(lái)如此 閱讀(431) 評(píng)論(0)  編輯  收藏 所屬分類: ssh
          主站蜘蛛池模板: 奎屯市| 古田县| 北海市| 昌吉市| 平罗县| 兴宁市| 交口县| 青州市| 萨迦县| 大足县| 平罗县| 鞍山市| 兴文县| 萍乡市| 红安县| 禹州市| 孝昌县| 安乡县| 安陆市| 海丰县| 怀集县| 澄迈县| 宜都市| 江山市| 柏乡县| 遵义县| 卫辉市| 高平市| 乐业县| 临沭县| 交城县| 南澳县| 宁波市| 西盟| 阳谷县| 夹江县| 巴林左旗| 资兴市| 镇雄县| 油尖旺区| 九龙坡区|