隨筆 - 31  文章 - 2  trackbacks - 0
          由于OpenSessionInViewFilter把session綁在當前線程上,導致session的生命周期比事務要長,這期間所有事務性操作都在復用這同一個session,由此產生了一些“怪問題”:
          1.出現如下錯誤
          ???? 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綁在當前線程上的時候,會把session的flush mode 設為FlushMode.NEVER,因此,如果某個方法沒有事務或者有只讀事務,則不能對session做insert,update,delete操作,除非事先把session的flush mode手動設為auto
          方案:
          1、將singleSession設為false,這樣只要改web.xml,缺點是Hibernate Session的Instance可能會大增,使用的JDBC Connection量也會大增,如果Connection Pool的maxPoolSize設得太小,很容易就出問題。<!-- singleSession默認為true,若設為false則等于沒用OpenSessionInView -->
          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的事務控制(service和配置文件對應)
          posted on 2007-11-02 17:12 緣來如此 閱讀(430) 評論(0)  編輯  收藏 所屬分類: ssh
          主站蜘蛛池模板: 凤庆县| 同仁县| 新晃| 日照市| 海宁市| 武隆县| 同江市| 巴东县| 安平县| 龙游县| 阳信县| 乐东| 拜城县| 阿荣旗| 石景山区| 新密市| 江西省| 平武县| 新蔡县| 田阳县| 靖安县| 兰西县| 社会| 思南县| 萝北县| 葫芦岛市| 苗栗市| 聂荣县| 湛江市| 玉环县| 留坝县| 乐平市| 丰台区| 嘉禾县| 米脂县| 扎兰屯市| 新乡县| 城口县| 丰原市| 金华市| 绍兴县|