`
爱像天空
  • 浏览: 204649 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

申明式事务和OpenSessionInView

    博客分类:
  • SSH
阅读更多
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.


今天在做事务测试的时候,控制台输出了以上的错误信息,在网上找了一下,原来是我在web.xml
文件中设置了OpenSessionInView .  将设置去掉就可以了.
<!-- OpenSessionInView -->
  <filter>
   <filter-name>OpenSessionInViewFilter</filter-name>
   <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  </filter>
  <filter-mapping>
   <filter-name>OpenSessionInViewFilter</filter-name>
   <url-pattern>*.action</url-pattern>
  </filter-mapping>
或者加上事务设置

<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"
>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory"></property>
</bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
   <tx:method name="create*" propagation="REQUIRED"/>
   <tx:method name="update*" propagation="REQUIRED"/>
   <tx:method name="delete*" propagation="REQUIRED"/>
   <tx:method name="find*" propagation="REQUIRED" read-only="true"/>
   <tx:method name="*" read-only="true"/>
  </tx:attributes>
</tx:advice>

<aop:config>
  <aop:pointcut id="daoOperation" expression="execution(* dgut.ke.dao.*.*(..))"/>
  <aop:advisor advice-ref="txAdvice" pointcut-ref="daoOperation"/>
</aop:config>

</beans>

网上又说
尽管Open Session In View看起来还不错,其实副作用不少。看回上面OpenSessionInViewFilter的doFilterInternal方法代码,这个方法实际上是被父类的doFilter调用的,因此,我们可以大约了解的OpenSessionInViewFilter调用流程: request(请求)->open session并开始transaction->controller->View(Jsp)->结束transaction并close session.

     一切看起来很正确,尤其是在本地开发测试的时候没出现问题,但试想下如果流程中的某一步被阻塞的话,那在这期间connection就一直被占用而不释放。最有可能被阻塞的就是在写Jsp这步,一方面可能是页面内容大,response.write的时间长,另一方面可能是网速慢,服务器与用户间传输时间久。当大量这样的情况出现时,就有连接池连接不足,造成页面假死现象。

Open Session In View是个双刃剑,放在公网上内容多流量大的网站请慎用。

分享到:
评论

相关推荐

    Spring hibernate opensessioninview

    ### Spring + Hibernate OpenSessionInView 模式的理解和应用 在Java Web开发中,Spring与Hibernate作为两个重要的框架,经常被一起使用来实现业务逻辑与数据持久化的处理。而在使用这两个框架时,为了更好地管理...

    Struts Spring Hibernate 整合 OpenSessionInView 例子

    为了练手培训,给大家准备的 Open Session In View 的简单例子,纯代码,大家可以参考,其中主要说了六部分内容: ...5.通过 spring aop(aspectJ) 声明事务 6.通过formular 映射参数表,指定两个死的变量

    Spring提供的CharacterEncoding和OpenSessionInView功能

    SSH框架结合了Struts的MVC设计模式、Spring的依赖注入和事务管理以及Hibernate的持久化能力,为Java Web开发提供了强大的支持。然而,随着Spring Boot的兴起,SSH框架的使用逐渐减少,更多地转向了Spring Boot的开箱...

    第30讲--Spring提供的CharacterEncoding和OpenSessionInView功能

    同时,需要注意的是,OpenSessionInView模式虽然方便,但也会带来潜在的问题,如事务边界不清晰和会话泄漏。因此,在实际应用中,应结合具体需求谨慎使用,并考虑使用更现代的解决方案,如Spring Data JPA的...

    OpenSessionInView项目整合jar包

    理解OpenSessionInView模式及其整合过程对Java Web开发者至关重要,它可以帮助优化数据访问性能,避免由于Session关闭引发的懒加载异常,提高应用程序的稳定性和用户体验。同时,注意合理配置和使用,以防止长时间...

    SSH项目整合示例【OpenSessionInView】所用到的jar包

    这个框架集成提供了模型-视图-控制器(MVC)架构,数据持久化,以及依赖注入和事务管理等功能,大大简化了企业级应用的开发工作。 **Struts** 是一个基于MVC设计模式的Java Web框架,主要用于处理用户请求和展示...

    Open_Session_In_View详解.doc

    2. **移除只读标记**:确保事务定义中没有设置`readOnly`标志。 3. **使用特定的session管理策略**:对于需要写操作的情况,可以考虑不在这些请求中使用`Open Session In View`。 总之,`Open Session In View`是...

    spring面试题大全

    1. 编程式事务管理:使用TransactionDefinition、TransactionStatus和PlatformTransactionManager接口进行事务控制。例如,定义事务、开始事务、在try-catch块中执行业务逻辑并决定提交或回滚事务。 2. 声明式事务...

    spring面试题大全.doc

    对于OpenSessionInView模式,可以通过`OpenSessionInViewFilter`或`OpenSessionInViewInterceptor`来处理事务和会话范围的问题。 5. **Spring事务管理**: - **TransactionDefinition**:定义事务的属性,如隔离...

    收集的struts+spring+hibernate面试题.doc

    - **事务管理方式**:支持声明式事务管理和编程式事务管理。 - **隔离级别**: - `ISOLATION_DEFAULT`:使用数据库默认隔离级别。 - `ISOLATION_READ_UNCOMMITTED`:最低隔离级别,允许脏读。 - `ISOLATION_READ_...

    struts spring hibernate面试题

    - **事务管理**:Spring 提供了两种事务管理方式:声明式事务管理和编程式事务管理。通过 `PlatformTransactionManager` 接口来管理事务的开始、提交和回滚。常见的实现包括 `HibernateTransactionManager` 和 `Jpa...

    java-spring面试题大全

    - **声明式事务管理**:基于AOP的事务管理,如使用TransactionProxyFactoryBean,通过注解或XML配置指定事务传播行为,如PROPAGATION_REQUIRED等,更简洁且易于维护。 声明式事务管理是Spring中常见的选择,因为它...

    struts+spring+hibernate面试题

    - 有两种方式:声明式事务(基于注解或XML配置)和编程式事务(通过TransactionTemplate或PlatformTransactionManager)。 - 事务隔离级别:DEFAULT、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和...

    spring面试大全

    7. **事务管理**:Spring 提供了两种事务管理方式:编程式和声明式。编程式事务管理使用TransactionDefinition和TransactionStatus对象,以及PlatformTransactionManager接口,虽然灵活,但代码冗余较高。声明式事务...

    面试知识点总结--spring面试题大全.pdf

    事务处理通常分为编程式和声明式两种: 1. 编程式事务管理:更灵活,但代码量较大,可能有重复。例如,通过TransactionTemplate进行事务回调,如: ```java void add() { transactionTemplate.execute(new ...

    spring面试题

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

    spring面试题集

    1. 编程式事务管理:通过TransactionDefinition、TransactionStatus和PlatformTransactionManager接口进行事务的控制。例如,可以使用TransactionTemplate简化事务处理代码,但在大型项目中,这种方式可能会导致过多...

    spring中lazy=“true”的正常读取关联表(用opensessioninview)

    在Spring框架中,`lazy="true"` 是一个重要的特性,用于延迟加载(Lazy Loading)。...然而,OSIV也存在潜在的问题,因此在实际应用中需要权衡利弊,合理设计数据模型和事务管理,以达到最佳的性能和稳定性。

    Spring框架1

    Spring中,AOP主要应用于切面的声明和实现,例如声明式事务管理。 - **IOC(控制反转)**:对象的创建和依赖关系的管理由容器(如Spring)负责,而不是由对象自身负责。Spring通过依赖注入(DI)实现IOC,主要有三...

Global site tag (gtag.js) - Google Analytics