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 模式的理解和应用 在Java Web开发中,Spring与Hibernate作为两个重要的框架,经常被一起使用来实现业务逻辑与数据持久化的处理。而在使用这两个框架时,为了更好地管理...
为了练手培训,给大家准备的 Open Session In View 的简单例子,纯代码,大家可以参考,其中主要说了六部分内容: ...5.通过 spring aop(aspectJ) 声明事务 6.通过formular 映射参数表,指定两个死的变量
SSH框架结合了Struts的MVC设计模式、Spring的依赖注入和事务管理以及Hibernate的持久化能力,为Java Web开发提供了强大的支持。然而,随着Spring Boot的兴起,SSH框架的使用逐渐减少,更多地转向了Spring Boot的开箱...
同时,需要注意的是,OpenSessionInView模式虽然方便,但也会带来潜在的问题,如事务边界不清晰和会话泄漏。因此,在实际应用中,应结合具体需求谨慎使用,并考虑使用更现代的解决方案,如Spring Data JPA的...
理解OpenSessionInView模式及其整合过程对Java Web开发者至关重要,它可以帮助优化数据访问性能,避免由于Session关闭引发的懒加载异常,提高应用程序的稳定性和用户体验。同时,注意合理配置和使用,以防止长时间...
这个框架集成提供了模型-视图-控制器(MVC)架构,数据持久化,以及依赖注入和事务管理等功能,大大简化了企业级应用的开发工作。 **Struts** 是一个基于MVC设计模式的Java Web框架,主要用于处理用户请求和展示...
2. **移除只读标记**:确保事务定义中没有设置`readOnly`标志。 3. **使用特定的session管理策略**:对于需要写操作的情况,可以考虑不在这些请求中使用`Open Session In View`。 总之,`Open Session In View`是...
1. 编程式事务管理:使用TransactionDefinition、TransactionStatus和PlatformTransactionManager接口进行事务控制。例如,定义事务、开始事务、在try-catch块中执行业务逻辑并决定提交或回滚事务。 2. 声明式事务...
对于OpenSessionInView模式,可以通过`OpenSessionInViewFilter`或`OpenSessionInViewInterceptor`来处理事务和会话范围的问题。 5. **Spring事务管理**: - **TransactionDefinition**:定义事务的属性,如隔离...
- **事务管理方式**:支持声明式事务管理和编程式事务管理。 - **隔离级别**: - `ISOLATION_DEFAULT`:使用数据库默认隔离级别。 - `ISOLATION_READ_UNCOMMITTED`:最低隔离级别,允许脏读。 - `ISOLATION_READ_...
- **事务管理**:Spring 提供了两种事务管理方式:声明式事务管理和编程式事务管理。通过 `PlatformTransactionManager` 接口来管理事务的开始、提交和回滚。常见的实现包括 `HibernateTransactionManager` 和 `Jpa...
- **声明式事务管理**:基于AOP的事务管理,如使用TransactionProxyFactoryBean,通过注解或XML配置指定事务传播行为,如PROPAGATION_REQUIRED等,更简洁且易于维护。 声明式事务管理是Spring中常见的选择,因为它...
- 有两种方式:声明式事务(基于注解或XML配置)和编程式事务(通过TransactionTemplate或PlatformTransactionManager)。 - 事务隔离级别:DEFAULT、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和...
7. **事务管理**:Spring 提供了两种事务管理方式:编程式和声明式。编程式事务管理使用TransactionDefinition和TransactionStatus对象,以及PlatformTransactionManager接口,虽然灵活,但代码冗余较高。声明式事务...
事务处理通常分为编程式和声明式两种: 1. 编程式事务管理:更灵活,但代码量较大,可能有重复。例如,通过TransactionTemplate进行事务回调,如: ```java void add() { transactionTemplate.execute(new ...
- **OpenSessionInView**:解决长时间请求导致的事务问题,可通过添加 OpenSessionInViewFilter 或 OpenSessionInViewInterceptor。 5. **Spring 事务管理** - **TransactionDefinition**:定义事务属性,如隔离...
1. 编程式事务管理:通过TransactionDefinition、TransactionStatus和PlatformTransactionManager接口进行事务的控制。例如,可以使用TransactionTemplate简化事务处理代码,但在大型项目中,这种方式可能会导致过多...
在Spring框架中,`lazy="true"` 是一个重要的特性,用于延迟加载(Lazy Loading)。...然而,OSIV也存在潜在的问题,因此在实际应用中需要权衡利弊,合理设计数据模型和事务管理,以达到最佳的性能和稳定性。
Spring中,AOP主要应用于切面的声明和实现,例如声明式事务管理。 - **IOC(控制反转)**:对象的创建和依赖关系的管理由容器(如Spring)负责,而不是由对象自身负责。Spring通过依赖注入(DI)实现IOC,主要有三...