`
kjkhi
  • 浏览: 184811 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

OpenSessionInViewFilter更新问题

阅读更多
在项目中配置OpenSessionInViewFilter后,首先会出现的问题:
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.

这个是因为OpenSessionInViewFilter在getSession的时候,会把获取回来的session的flushMode 设为FlushMode.NEVER。然后把该sessionFactory绑定到TransactionSynchronizationManager,使request的整个过程都使用同一个session。
FlushMode.NEVER模式不具备写操作,可以把session配置为FlushMode.AUTO,如在web.xml中配置:
<filter>
  	<filter-name>OpenSessionInView</filter-name>
  	<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  		<init-param>
          	<param-name>flushMode</param-name>
          	<param-value>AUTO</param-value>
      	</init-param>
  </filter>


其次,会遇到的另外一个问题是页面更新操作,因为这个流程是:首先查询取得数据库中的记录,修改客户端改变的属性,更新这个实体类。这是通过以上配置OpenSessionInViewFilter,在session更新实体类之前,session已经存在一个实体类,与客户端传过来的需要修改的实体类会发生冲突,以致更新失败。这个可以通过配置singleSession=false解决。也可以通过重写OpenSessionInViewFilter类的getSession及closeSession方法实现,如:
public class MyOpenSessionInViewFilter extends OpenSessionInViewFilter{

	@Override
	protected void closeSession(Session session, SessionFactory sessionFactory) {
		session.flush();
		session.getTransaction().commit();
		super.closeSession(session, sessionFactory);
	}

	@Override
	protected 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;
	}

}
0
0
分享到:
评论
3 楼 onlyOneToOne 2013-06-17  
如果你在项目中配置了OpenSessionInViewFilter,但是没有配置事务,它会认为你访问的方法默认的事务边界为read-only。所以建议配置事务后使用。不要刻意去修改OpenSessionInViewFilter的flushMode!
2 楼 sswh 2011-06-28  
另外,设置singleSession=false的含义是 延迟Session的关闭到Filter结束的时候。
singleSession=false并不决定使用同一个Session还是多个Session。
这个还是要由Spring事务传播行为来决定。
而使用多个Session反而更容易出现update失败的情况。
1 楼 sswh 2011-06-28  
第1个问题:
在写操作的时候尽量使用事务(比如,Spring事务在打开时会更改FlushMode)。
OpenSessionInView的FlushMode设置为Never是有道理的,
这对于列表或者查询请求,会去掉hibernate进行脏检查的时间,可以提升效率。

第2个问题:
可以用merge方法,就不会出现update失败的情况了。
但通常update执行之前,如果不做复杂查询的话,一般update也很少会出错的。

另外,按你更改的代码,问题更多:
1、底层数据库连接时间延长了(扩展到了Filter的范围),而正常使用OpenSessionInView的话,是在打开事务的时候才获取底层数据库连接的。
2、没法处理回滚的情况。
3、对于查询类请求,效率降低。(FlushMode.AUTO)

相关推荐

    jar包(struts2.0.8+spring2.0+hibernate3.2)

    在实际项目中,这样的集成方案可以帮助开发团队快速开发出高效、稳定的Java Web应用,但同时也需要注意版本兼容性、性能优化以及安全问题。例如,Struts2框架在后续版本中修复了一些安全漏洞,因此在使用旧版本时需...

    过滤器对于session周期的控制

    在Hibernate框架中,`Session`是执行数据库操作的核心接口,它负责进行持久化操作,如保存、更新或删除实体对象等。为了确保数据的一致性和事务的完整性,Session的生命周期是非常重要的。通常情况下,一个Session...

    使用Spring引起的错误

    #### 问题背景 在使用Spring框架时,特别是在与Hibernate结合的情况下,可能会遇到“Write operations are not allowed in read-only mode (FlushMode.NEVER)”这样的异常。这个问题通常发生在使用Spring提供的Open...

    Hibernate事务管理.

    例如,如果在请求结束时有写操作(如更新、删除),可能会导致并发控制问题,因为Session在整个请求中保持开放,可能导致脏读或幻读。这时,可能会遇到`InvalidDataAccessApiUsageException`异常,提示写操作不允许...

    错误及解决方案.pdf

    这是解决在双向关联中防止多表更新问题的一种常见方法。 知识点六:Hibernate的实体和DTO 在内容中提到了ad.setAdProd(adform.getAdProd())等类似的操作,这表明了将表单对象中的数据设置到持久化实体中的过程。这...

    spring_demo:Spring MVC示范项目

    在更新或删除数据时,必须调用getHibernateTemplate().flush(); 且在web.xml中添加 &lt;filter&gt;openSessionInViewFilter &lt;filter&gt;org.springframework.orm.hibernate4.support.OpenSessionInViewFilter &lt;param&gt;...

    搭建SSH框架步骤.pdf

    同时,添加`OpenSessionInViewFilter`,以解决多线程环境下Hibernate的Session管理问题。 10. **编写Action类**: - Action类通常对应于一个特定的业务逻辑,例如,AddBean、ListBean等,它们继承自Struts2的...

    HIBERNATE4开发文档,HIBERNATE4的变化

    为了解决这个问题,可以添加`OpenSessionInViewFilter`过滤器,确保在视图渲染期间保持session打开。 5. **分页查询的注意事项** - Hibernate4中,如果你在进行分页查询时遇到“ResultSet may only be accessed in...

    搭建SSH框架步骤

    - 更新`applicationContext.xml`中的`&lt;property name="mappingResources"&gt;`元素,列出所有映射文件的位置。 4. **编写DAO接口和实现**: - 定义数据访问对象(DAO)接口,用于与数据库交互。 - 编写DAO实现类,...

    java和数据库性能优化.doc

    session缓存的作用域可根据配置延长至jsp和action,通过`openSessionInViewFilter`实现;查询缓存用于提高频繁查询的效率,尤其适用于更新较少的场景。 **Java内存管理**分为持久化内存(perm)和非持久化内存。...

    ssh整合要点

    在web.xml中配置Spring的监听器ContextLoaderListener以初始化Spring应用上下文,并通过OpenSessionInViewFilter来处理可能出现的SessionFactory问题,确保在Controller和Service之间保持有效的Hibernate Session。...

    hibernate资料

    5. **活跃的社区支持**:Hibernate 是开源的,有活跃的开发者社区,这意味着不断的技术更新和问题解决。 【Hibernate 延迟加载(Lazy Loading)】 延迟加载是一种优化策略,它只在真正需要数据时才加载。例如,...

    spring面试题

    - **OpenSessionInView**:解决长时间请求导致的事务问题,可通过添加 OpenSessionInViewFilter 或 OpenSessionInViewInterceptor。 5. **Spring 事务管理** - **TransactionDefinition**:定义事务属性,如隔离...

    java-spring面试题大全

    - 解决OpenSessionInView问题,可以使用OpenSessionInViewFilter或OpenSessionInViewInterceptor,确保在HTTP请求的整个生命周期中都保持数据库会话。 5. **Spring的事务管理**: - Spring提供了...

    SSH三框架整合笔记

    `OpenSessionInViewFilter`过滤器与Hibernate集成,确保每个请求都有一个打开的Session,直到视图渲染完成。 ### 2. Hibernate Hibernate是一个强大的ORM(对象关系映射)框架,用于简化数据库操作,实现对象与...

    用户菜单管理

    同时,为了保证页面显示的中文字符正常,需要正确配置OpenSessionInViewFilter和中文编码过滤器。 总的来说,用户菜单管理是一个涉及前端交互、后端逻辑和数据库操作的复杂功能模块。它需要开发者具备扎实的SSH框架...

    ssh框架整合增删改查登录注册

    配置内容包括ContextLoaderListener监听器用于初始化Spring容器,OpenSessionInViewFilter用于管理Hibernate的Session,Struts2的过滤器配置等。 - applicationContext.xml配置:这是Spring的配置文件,用于配置...

    ssha 最新 最完整 配置信息

    -- 使用HQL更新数据库结构 --&gt; &lt;property name="hbm2ddl.auto"&gt;update &lt;!-- 设置Hibernate使用的方言 --&gt; &lt;property name="dialect"&gt;org.hibernate.dialect.MySQLDialect ``` #### Spring配置文件 **表格9*...

    SSH1,JQuery的ajax返回json二维数组处理过程

    // 更新第二级下拉框 }, error: function(xhr, status, error) { console.error("Error:", status, error); } }); }); $("#contentclass").click(function() { // 点击后显示对应的详细内容,可能需要额外的...

Global site tag (gtag.js) - Google Analytics