- 浏览: 598677 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (263)
- Struts2 (3)
- Spring (15)
- Apache (11)
- Java (57)
- Hibernate (10)
- Oracle (19)
- Linux (27)
- MYSQL (2)
- JavaScript (15)
- WebService (4)
- XFire (4)
- FreeMarker (2)
- JXL (2)
- Eclipse (5)
- PowerDesigner (6)
- Intellij IDEA (7)
- JQuery (6)
- EL&JSTL (3)
- SpringMVC (7)
- JAR&TLD (1)
- CMD&BAT (1)
- CSS (2)
- axis (2)
- dom4j (1)
- SoapUI (1)
- HttpClient (2)
- FusionCharts (4)
- 百度地图Api进阶教程 (5)
- SQLSERVER (15)
- 网站安全 (1)
- CXF (3)
- 文件同步软件 (0)
- Maven (9)
- Solr (2)
- QRCode (1)
- JSON (1)
- Dubbo (6)
- log4j2 (1)
- MyBatis (4)
- JavaWeb (1)
- activiti (2)
- kettle (1)
- JVM调优 (9)
最新评论
-
_739677725:
4楼的兄弟 你有源码没有?如果有可不可以帮忙转发一份 邮箱: ...
JAVA线程根据给定URL生成网页快照 -
_739677725:
下载不了了
JAVA线程根据给定URL生成网页快照 -
rhyhhg5:
还有一些url,抓图片的时候会提示脚本错误什么的,什么情况?
JAVA线程根据给定URL生成网页快照 -
rhyhhg5:
为什么 给 有些url,就抓不了图片呢
JAVA线程根据给定URL生成网页快照 -
feng_tai_jun:
总结很好。
Java中获取类加载路径和项目根路径
使用Spring提供的Open Session In View而引起Write operations are not allowed in read-only mode (FlushMode.NEVER) 错误解决:
在没有使用Spring提供的Open Session In View情况下,因需要在service(or Dao)层里把session关闭,所以lazy loading 为true的话,要在应用层内把关系集合都初始化,如 company.getEmployees(),否则 Hibernate抛session already closed Exception; Open Session In View提供了一种简便的方法,较好地解决了lazy loading问题.
它有两种配置方式OpenSessionInViewInterceptor和OpenSessionInViewFilter(具体参看SpringSide),功能相同,只是一个在web.xml配置,另一个在application.xml配置而已。
Open Session In View在request把session绑定到当前thread期间一直保持 hibernate session在open状态,使session在request的整个期间都可以使用,如在View层里PO也可以 lazy loading数据,如 ${ company.employees }。当View 层逻辑完成后,才会通过Filter的doFilter 方法或Interceptor的postHandle方法自动关闭session。
OpenSessionInViewInterceptor配置
<beans>
<bean name="openSessionInViewInterceptor"
class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="openSessionInViewInterceptor"/>
</list>
</property>
<property name="mappings">
..
</property>
</bean>
</beans>
OpenSessionInViewFilter配置
<web-app>
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<!-- singleSession默认为true,若设为false则等于没用OpenSessionInView -->
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
</web-app>
很多人在使用OpenSessionInView过程中提及一个错误:
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里的几个方法
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,FilterChain filterChain)
throws ServletException, IOException {
SessionFactory sessionFactory = lookupSessionFactory();
logger.debug("Opening Hibernate Session in OpenSessionInViewFilter");
Session session = getSession(sessionFactory);
TransactionSynchronizationManager.bindResource(
sessionFactory, new SessionHolder(session));
try {
filterChain.doFilter(request, response);
}
finally {
TransactionSynchronizationManager.unbindResource(sessionFactory);
logger.debug("Closing Hibernate Session in OpenSessionInViewFilter");
closeSession(session, sessionFactory);
}
}
protected Session getSession(SessionFactory sessionFactory)
throws DataAccessResourceFailureException {
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
session.setFlushMode(FlushMode.NEVER);
return session;
}
protected void closeSession(Session session, SessionFactory sessionFactory)
throws CleanupFailureDataAccessException {
SessionFactoryUtils.closeSessionIfNecessary(session, sessionFactory);
}
可以看到OpenSessionInViewFilter在getSession的时候,会把获取回来的session的 flush mode 设为FlushMode.NEVER。然后把该sessionFactory绑定到 TransactionSynchronizationManager,使request的整个过程都使用同一个session,在请求过后再接除该 sessionFactory的绑定,最后closeSessionIfNecessary根据该 session是否已和transaction绑定来决定是否关闭session。在这个过程中,若HibernateTemplate 发现自当前session有不是readOnly的 transaction,就会获取到FlushMode.AUTO Session,使方法拥有写权限。
public static void closeSessionIfNecessary(Session session, SessionFactory sessionFactory)
throws CleanupFailureDataAccessException {
if (session == null ||
TransactionSynchronizationManager.hasResource(sessionFactory)) {
return;
}
logger.debug("Closing Hibernate session");
try {
session.close();
}
catch (JDBCException ex) {
// SQLException underneath
throw new CleanupFailureDataAccessException("Could not close Hibernate session", ex.getSQLException());
}catch (HibernateException ex) {
throw new CleanupFailureDataAccessException("Could not close Hibernate session", ex);
}
}
也即是,如果有不是readOnly的transaction就可以由Flush.NEVER转为Flush.AUTO,拥有 insert,update,delete操作权限,如果没有transaction,并且没有另外人为地设flush model的话,则 doFilter的整个过程都是Flush.NEVER。所以受transaction保护的方法有写权限,没受保护的则没有。
采用spring的事务声明,使方法受transaction控制
<bean id="baseTransaction"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager"/>
<property name="proxyTargetClass" value="true"/>
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="userService" parent="baseTransaction">
<property name="target">
<bean class="com.phopesoft.security.service.impl.UserServiceImpl"/>
</property>
</bean>
对 于上例,则以save,add,update,remove开头的方法拥有可写的事务,如果当前有某个方法,如命名为importExcel(),则因没 有transaction而没有写权限,这时若方法内有insert,update,delete操作的话,则需要手动设置flush model 为Flush.AUTO,如
session.setFlushMode(FlushMode.AUTO);
session.save(user);
session.flush();
尽 管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 mvc 防止重复提交表单的两种方法,推荐第二种
2017-11-24 17:54 2930http://blog.csdn.net/u013378306 ... -
Java SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
2017-11-23 11:04 3042http://blog.csdn.net/liyisong ... -
Spring中,在Java任何位置获取request对象
2017-10-12 22:48 2489看RequestContextListener和Reques ... -
Cron表达式说明
2017-07-28 17:24 431CronTrigger CronTriggers往往比Si ... -
Spring定时任务的几种实现
2017-07-28 17:09 476Spring定时任务的几种实现 近日项目开发中需要执行一 ... -
Spring整合Ehcache管理缓存
2017-06-29 18:12 502参考:http://www.cnblogs.com/jingm ... -
SpringMVC 之@RequestBody 接收Json数组对象
2017-06-22 17:49 42841. 摘要 程序流程: 前台使用ajax技术, ... -
注解@PostConstruct与@PreDestroy讲解及实例
2017-06-20 09:23 514Spring 容器中的 Bean 是有生命周期的,Spri ... -
Spring中ServletContextAware接口使用理解
2017-06-20 09:17 705在spring中,凡是实现ServletContextAwa ... -
Spring aop execution表达式
2017-06-09 14:23 368execution 中第一个*表示任何返回类型. 要注意 ... -
使用spring @Scheduled注解执行定时任务
2017-05-05 18:03 349http://blog.csdn.net/sd4000784/ ... -
SpringMVC @RequestBody接收Json对象字符串
2016-11-11 13:37 859JavaScript代码: <script typ ... -
Hibernate二级缓存(Ehcache)和Spring 整合使用
2016-03-02 17:51 2000参阅: http://gqsunrise.iteye.c ... -
Spring IoC与DI
2009-08-25 11:56 935IoC与DI 首先想说说IoC(Inversion of ...
相关推荐
OpenSessionInViewFilter个人学习总结
OpenSessionInViewFilter是Spring框架中一个非常重要的组件,主要用于解决数据访问层(DAO)与视图层(View)之间的事务管理问题。在Web应用中,由于HTTP请求的无状态性,一次请求通常由多个Servlet过滤器、控制器和...
我们可以通过配置XML文件和注解来实现整合,并使用opensessionInviewfilter来解决会话问题。 Spring JDBC面向接口编程 本节讲解了如何使用Spring JDBC来实现面向接口编程。我们可以通过配置XML文件和注解来实现DAO...
解决这个问题的方法有两种:一种是在 web.xml 中使用 Spring 提供的 OpenSessionInViewFilter,另一种是在 application.xml 中配置 OpenSessionInViewFilter。前者通用,后者只能用于 SpringMVC 结构中。 最后,...
- 在`web.xml`中配置`OpenSessionInViewFilter`过滤器,自动管理事务。 #### 三、总结 通过以上步骤,我们不仅可以让Spring有效地管理Struts,实现更灵活的业务逻辑控制,还可以利用Spring的强大功能管理...
Spring框架还提供了一系列的过滤器来处理Web应用中的请求,例如OpenSessionInViewFilter用于解决Hibernate懒加载问题。 - **OpenSessionInViewFilter**:此过滤器在请求处理开始时打开一个Hibernate会话,在请求...
4. 解决OpenSessionInView问题,可以使用OpenSessionInViewFilter或OpenSessionInViewInterceptor,确保在一次HTTP请求中保持Hibernate Session的开放状态,以解决懒加载异常。 Spring的事务管理分为编程式和声明式...
该模式的核心在于通过Spring提供的`OpenSessionInViewFilter`过滤器,在视图渲染过程中保持Hibernate Session的打开状态,从而简化了事务管理,并避免了一些常见的懒加载异常。 #### 一、OpenSessionInViewFilter...
在Web应用中,为了确保每次请求都能获得新的Session,通常会配置openSessionInViewFilter,保证数据操作的正确性。 整合SSH的步骤如下: 1. 引入SSH相关的jar包,确保版本兼容。Struts和Hibernate的jar包可以从IDE...
**Spring 2.5 学习大纲** Spring 2.5 是一个重要的版本,它包含了许多关键特性,如控制反转...通过以上内容的学习,开发者可以深入理解Spring 2.5的核心概念,掌握其在实际开发中的应用,从而提高工作效率和代码质量。
【Struts、Spring与Hibernate集成】是Java Web开发中常见的技术组合,用于构建高效、松耦合的MVC应用程序。这三大框架的集成使得开发者能够更好地管理数据访问、业务逻辑和用户界面,提高代码的可维护性和可测试性。...
Spring框架是Java开发中不可或缺的一部分,它以其强大的功能和灵活性深受开发者喜爱。本文将深入探讨Spring框架的一些核心概念,包括其优点、依赖注入(DI,Dependency Injection)的实现方式、控制反转(IoC,...
1. **Spring配置Hibernate SessionFactory**:在`applicationContext.xml`中配置`SessionFactory`,并通过Spring的依赖注入机制将数据源注入到SessionFactory中。 2. **Struts2配置Spring插件**:在`struts.xml`中...
Struts、Hibernate和Spring是Java开发中常用的三个框架,它们分别负责表现层、持久层和业务层的管理。将这三个框架整合在一起可以实现一个高效、松耦合的企业级应用程序。 1. **Struts** 是一个MVC(Model-View-...
### Spring监听器与过滤器详解...- **Spring Web环境下的监听器和过滤器**:在Spring MVC环境中,除了上述提到的OpenSessionInViewFilter和CharacterEncodingFilter,还有多种其他类型的过滤器和监听器可以使用,例如`...
10. **延迟加载问题**:为了处理Hibernate的延迟加载问题,可以使用Spring的`OpenSessionInViewFilter`。这个过滤器确保在一次HTTP请求的整个生命周期内,Hibernate的Session保持打开状态,允许延迟加载在请求结束时...