由于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
緣來如此 閱讀(426)
評論(0) 編輯 收藏 所屬分類:
ssh