OpenSessionInViewFilter更新问题
在项目中配置OpenSessionInViewFilter后,首先会出现的问题:
public class MyOpenSessionInViewFilter extends OpenSessionInViewFilter{@Overrideprotected void closeSession(Session session, SessionFactory sessionFactory) {session.flush();session.getTransaction().commit();super.closeSession(session, sessionFactory);}@Overrideprotected Session getSession(SessionFactory sessionFactory)throws DataAccessResourceFailureException {Session session = SessionFactoryUtils.getSession(sessionFactory, true);session.beginTransaction();FlushMode flushMode = getFlushMode();if (flushMode != null) {this.setFlushMode(FlushMode.AUTO);}return session;}}1 楼 sswh 2011-06-28 第1个问题:
在写操作的时候尽量使用事务(比如,Spring事务在打开时会更改FlushMode)。
OpenSessionInView的FlushMode设置为Never是有道理的,
这对于列表或者查询请求,会去掉hibernate进行脏检查的时间,可以提升效率。
第2个问题:
可以用merge方法,就不会出现update失败的情况了。
但通常update执行之前,如果不做复杂查询的话,一般update也很少会出错的。
另外,按你更改的代码,问题更多:
1、底层数据库连接时间延长了(扩展到了Filter的范围),而正常使用OpenSessionInView的话,是在打开事务的时候才获取底层数据库连接的。
2、没法处理回滚的情况。
3、对于查询类请求,效率降低。(FlushMode.AUTO)
2 楼 sswh 2011-06-28 另外,设置singleSession=false的含义是 延迟Session的关闭到Filter结束的时候。
singleSession=false并不决定使用同一个Session还是多个Session。
这个还是要由Spring事务传播行为来决定。
而使用多个Session反而更容易出现update失败的情况。