由于OpenSessionInViewFilter把session綁在當前線程上,導(dǎo)致session的生命周期比事務(wù)要長,這期間所有事務(wù)性操作都在復(fù)用這同一個session,由此產(chǎn)生了一些“怪問題”:
1.
出現(xiàn)如下錯誤:
???? 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 設(shè)為FlushMode.NEVER,因此,如果某個方法沒有事務(wù)或者有只讀事務(wù),則不能對session做insert,update,delete操作,除非事先把session的flush mode手動設(shè)為auto
方案:
1、將singleSession設(shè)為false,這樣只要改web.xml,缺點是Hibernate Session的Instance可能會大增,使用的JDBC Connection量也會大增,如果Connection Pool的maxPoolSize設(shè)得太小,很容易就出問題。<!-- singleSession默認為true,若設(shè)為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的事務(wù)控制(service和配置文件對應(yīng))
posted on 2007-11-02 17:12
緣來如此 閱讀(426)
評論(0) 編輯 收藏 所屬分類:
ssh