- 浏览: 359196 次
- 性别:
- 来自: 广东广州
文章分类
最新评论
-
javaAlpha:
我现在也是一直出现这样的错误。也是java调用。net的接口A ...
关于java调用.net webserivce出现: 服务器无法处理请求。 --> 未将对象引用设置到对象的实例 -
javalover1:
贴出你的代码供大家学习学习啦
验证码的破解思路! -
liaolliso:
你好,请问你的最后一种方法,怎么从rgb值里 直接将每个部分的 ...
验证码的破解思路! -
tant:
天涯之海 写道从网页的session里下手好些吧
请问怎样从 ...
验证码的破解思路! -
wilddonkey:
lz此言说的到位啊
现实中很多人在这样的公司还没有做到了解这个 ...
转: 如何在管理不规范的公司中生存
它有两种配置方式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是个双刃剑,放在公网上内容多流量大的网站请慎用。
发表评论
-
主题: 优化程序之前,可用Jamon来监测你的Spring应用
2007-10-18 21:38 1222/** *作者:张荣华(ahuaxu ... -
Java与.NET 的Web Services相互调用
2007-10-12 21:24 4675一:简介 本文介绍了Java ... -
用Axis开发基于Java的Web服务
2007-10-12 21:15 1977概述 本文介绍了一个比较简单实用的基于Java的SOAP引 ... -
axis的部署方式
2007-10-12 20:57 1984以JWS的方式在TOMCAT上的部署WEBSERVICE 前言 ... -
商业化专题系统辅助表单验证
2007-10-08 21:07 1092<meta content="Edit ... -
JavaScript获取网页中HTML元素的几种方法分析
2007-10-08 20:54 3623getElementById getElementsByNam ... -
JSTL语法及参数
2007-10-07 22:43 2688js 代码 xml 代码 JSTL语法及参数 ... -
JSTL详解(一)
2007-10-07 22:35 1416概述 <o:p></o:p> 在 J ... -
类与类关系的UML图与代码表现
2007-10-07 22:24 1822关键字: OO UML,泛化,依赖,关联,聚合 ... -
用ActionForward优化你的Struts应用程序
2007-09-28 19:48 1270简单之中也蕴涵着复杂性,我们在本系列第一部分和第二部分创建、 ... -
用ActionRedirect 在 struts action 中重定向url
2007-09-26 13:18 6306struts的action中使用ActionForward来转 ... -
Struts Action的多种角色
2007-09-26 13:09 1370Action类是用户请求 ... -
在Struts中解决给Redirect过去的Action传参数
2007-09-26 13:07 2760String path = mapping.findForwa ... -
Hibernate 中oracle 主键的自动生成办法(笔记)
2007-09-22 08:49 15801:uuid.hex: 采用128位的算法来生成一个32位字符 ... -
利用Token机制解决重复重复提交问题
2007-06-15 08:52 1844本文为本人在dev2dev回答 ... -
关于Spring主题功能
2007-03-01 09:18 1530引言:朋友问我Spring的主题如何使用,我也不会,结果去g ... -
Spring XML配置十二个最佳实践PART ONE
2007-02-26 14:45 1097在这篇文章里,对于Spring XML的配置,我将向你 ... -
Struts标签库详解
2007-02-12 09:14 1592Struts提供了五个标签库,即:HTML、Bean、Logi ...
相关推荐
Open Session in View模式.PPT
struts2+hibernate3 做的小项目 使用了struts2插件实现pen session in view
在没有使用Spring提供的Open Session In View情况下,因需要在service(or Dao)层里把session关闭,所以lazy loading 为true的话,要在应用层内把关系集合都初始化,如 company.getEmployees(),否则Hibernate抛...
niUSRP open session in labview
Advances and Open Problems in Federated Learning。Federated learning (FL) is a machine learning setting where many clients (e.g. mobile devices or whole organizations) collaboratively train a model ...
Advances and Open Problems in Federated Learning
重定向的时候是有session丢失的问题;window.open丢失session问题;使用框架(Frameset)调用不同域名下的页面,会出现此域下页面的Cookies和Session丢失的现象。
Open IFrame In News Table 一款Chrome扩展插件,通过该插件可以右键将网页嵌入的 IFrame 框架 快速使用 新tab 页签打开。
前端开源库-open-in-editor在编辑器中打开,在编辑器中打开文件
带有spring.jpa.open-in-view和JDBCTemplate的意外问题的复制者这个仓库是一个最小的Spring Boot应用程序,可以重现我在spring.jpa.open-in-view设置为true的真实应用程序中遇到的问题(如果Spring Boot JPA Starter...
open data structure (in c++)
联邦学习Advances and Open Problems in Federated Learning,谷歌最新力作,分析了联邦学习最新研究热点和未来的方向
下载此文件,然后直接双击运行,就可以去掉右键菜单中的“open in visual studio"选项
Openstack openvswitch neutron Openstack openvswitch neutron
open session in labview and lab 1
使用Spring提供的Open Session In View而引起Write operations are not allowed in read-only mode (FlushMode.NEVER) 错误解决
HP OpenView 网络管理软件的资料文档,中英文
SSH整合概述 应用IoC进行整合 应用AOP进行整合 Open Session In View模式
网易开源open source in netease