downpour 写的OpenSessionInView详解
http://www.iteye.com/topic/32001?page=1
SpringSide团队日志
http://calvin.blog.javascud.org/post/46.htm
HibernateTemplate中HibernateCallback的事务
http://www.blogjava.net/caixuetao/articles/113433.html
open session and Hibernate事务处理机制
http://blog.csdn.net/Explorering/archive/2006/06/14/797399.aspx
Hibernate事务
http://www.yesky.com/imagesnew/software/spring/orm.html
看完以上文章,对OpensessionInView有了更深的理解.
它为了实现Hibernate的延迟加载功能。基于一个请求一个hibernate session的原则。
spring中对OpenSessionInViewFilter的描述如下:
它是一个Servlet2.3过滤器,用来把一个Hibernate Session和一次完整的请求过程对应的线程相绑定。目的是为了实现"Open Session in View"的模式。
例如: 它允许在事务提交之后延迟加载显示所需要的对象。
一.如果配置OpensessionInView
1)request请求,服务器开个线程响应客户端
2)OpenSessionInViewFilter打开Session) ,绑定到当前线程
3) ServletDispatcher -> Action
4)打开Connection,启动事务) -> spring bean -> another spring bean -> (提交事务) -> bean执行完毕,
5)返回Action
6)render view(JSP/Template)
7)(OpenSessionInViewFilter关闭Session和Connection,取消绑定
其中第四步,在bean的dao里调用某方法时,继承的HibernateDaoSupport类,它的的HibernateTemplete的session也是判断当前线程有无session,若有的话直接使用.
对于Spring的OpenSessionInViewFilter来说,虽然数据库连接被保持了过长的时间,但是并没有锁定数据库资源,特别是事务资源。因为Spring的事务是通过TransactionInterceptor来实现的,在MVC结构中,当最后一个业务bean被调用结束以后,Transaction就已经被提交了。此后,虽然数据库连接还保持中,但是数据库资源没有锁定问题。
二.如果没用OpensessionInView
如果没有配置OpensessionInView,HibernateTemplete里的方法每次都是新开一个session,执行完关闭session
假设在你的应用中Hibernate是通过spring 来管理它的session.而且在你的应用中没有使用OpenSessionInViewFilter或者OpenSessionInViewInterceptor。session会在transaction结束后关闭。
如果你采用了spring的声明式事务模式,它会对你的被代理对象的每一个方法进行事务包装(AOP的方式)。如下:
<bean id="txProxyTemplate" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="manager" parent="txProxyTemplate">
<property name="target">
<bean class="org.appfuse.service.impl.BaseManager">
<property name="dao" ref="dao"/>
</bean>
</property>
</bean>
spring默认对RunTimeException及其子类回滚(例如DAOAccessException),也可以通过配置对任何CheckedException回滚
目标类org.appfuse.service.impl.BaseManager 的 save *方法的事务类型PROPAGATION_REQUIRED ,remove* 方法的事务类型PROPAGATION_REQUIRED,其他的方法的事务类型是PROPAGATION_REQUIRED,readOnly。
所以调用这个名为“manager”的bean的方法之后session就关掉了.
关于事务:
在业务层用AOP的方式通过TransactionInterceptor进行了事务的begin和commit的拦截,而在两个方法之间,你的transactionStatus一直与Thread绑定,在事务声明为required的时候DAO的方法都会参与到这个事务中,就是说这是同一个事务
分享到:
相关推荐
SSH是Java Web开发中的一个流行框架组合,由Struts、Hibernate和Spring三个组件构成。这个框架集成提供了模型-...尽管如此,理解SSH的整合对于学习和理解Java Web开发的历史以及现代框架的设计思想仍然具有重要意义。
OpenSessionInViewFilter是Spring框架中一个非常重要的组件,主要用于解决数据访问层(DAO)与视图层(View)之间的事务管理问题。...然而,当我们在服务层关闭了Session后,到视图层进行数据填充时,可能会遇到已关闭...
主要接口(尤其是Session),普通属性和关联关系映射,Native SQL,inverse lazy cascade,继承关系映射,HQL,性能优化(一级缓存,二级缓存,查询缓存),事务和并发控制(悲观锁,乐观锁),OpenSessionInView,...
opensessioninview是另一种事务管理策略,它在Web应用中常用于管理事务。悲观锁和乐观锁是解决并发问题的两种策略,Hibernate也提供了相应的支持。 Hibernate与Java持久化API(JPA)的集成是通过annotation方式完成...
掌握实体属性映射,关联关系映射,Native SQL,inverse,lazy,cascade,继承关系映射,HQL,性能优化,一级缓存,二级缓存,查询缓存,事务管理,悲观锁和乐观锁,以及OpenSessionInView和CurrentSession。...
- **事务配置**:未配置事务可能导致openSessionInView模式下异常。 - **中文乱码**:需要配置字符编码以解决乱码问题。 **SSH整合的jar包** - **Struts2,Hibernate,Spring**:确保引入了所有必要的jar包,包括...
- **openSessionInView**:一种实现读取操作时的懒加载技术。 - **CurrentSession**:获取当前线程中的Session实例。 #### 十四、Spring - **Spring**:一个轻量级的Java开发框架,提供了依赖注入、面向切面编程等...
SSH整合是Java Web开发中的一种经典技术栈,包括Spring、Struts和Hibernate三个核心框架。这个项目是一个基于最新版本SSH的示例应用,具体...开发者可以通过学习和实践这个项目,深入理解SSH整合的核心概念和实际运用。
#### 示例:OpenSessionInView Filter - **作用**:保持一个持久化上下文与HTTP请求的生命周期同步,以解决懒加载异常问题。 - **解决方案**:通过在Struts2配置文件中配置`OpenSessionInViewFilter`来实现。 ### ...
性能优化,一级缓存,二级缓存,查询缓存,事务管理(悲观锁、乐观锁),以及OpenSessionInView和CurrentSession策略。 9. **Spring**:IoC(控制反转)和DI(依赖注入)的核心概念,Spring的架构,AOP(面向切面...
- OpenSessionInView 交由 Spring 管理; - SessionFactory 也交由 Spring 管理; - 事务提交和回滚交给 Spring 处理; - 业务层 Bean 交由 Spring 管理; - 数据访问层 Bean 交由 Spring 管理。 - **具体步骤...
以上就是SSH项目整合示例的核心内容,通过这个示例,开发者可以学习到如何将Struts2、Spring和Hibernate三个框架高效地结合在一起,构建出完整的Web应用程序。理解并熟练掌握这些知识,将有助于提升在Java Web开发...
### Spring配置总结:深入解析与应用 #### 一、Spring框架概述 Spring是一个开源的Java平台框架,由Rod Johnson创建...通过对这些内容的学习和实践,可以极大地提升开发者在构建基于Spring框架的应用时的能力和效率。
当遇到OpenSessionInView问题时,可以使用OpenSessionInViewFilter或OpenSessionInViewInterceptor来解决。 Spring的事务管理提供了强大且灵活的机制,主要包括编程式和声明式两种方式: 1. 编程式事务管理:通过...
目录 1.1 Spring 框架学习路线:...........................................................................................................................4 1.2 Spring 框架的概述:...........................
### SSH配置总结与部署步骤详解 #### 一、SSH框架简介 SSH框架是Java Web开发领域内非常流行的一种组合框架,分别由Struts2、Spring和Hibernate三个技术组成。...希望对正在学习或使用SSH框架的开发者有所帮助。
Hibernate是Java领域中一款流行的持久化框架,它简化了与关系数据库之间的交互,提供了一种对象关系映射(ORM)的解决方案。以下是对面试中可能会遇到的...理解并掌握这些内容对于深入学习和使用Hibernate至关重要。
### SSH面试总结(非常全) #### Java面试宝典与SSH常问问题详解 在IT行业中,尤其是对于专注于Java开发的专业人士来说,掌握SSH框架(即Struts、...希望这份“SSH面试总结”能成为你在学习和职业道路上的有力助手。