`
java虫
  • 浏览: 535990 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

OpensessionInView学习

阅读更多
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项目整合示例【OpenSessionInView】所用到的jar包

    SSH是Java Web开发中的一个流行框架组合,由Struts、Hibernate和Spring三个组件构成。这个框架集成提供了模型-...尽管如此,理解SSH的整合对于学习和理解Java Web开发的历史以及现代框架的设计思想仍然具有重要意义。

    关于OpenSessionInViewFilter的学习

    OpenSessionInViewFilter是Spring框架中一个非常重要的组件,主要用于解决数据访问层(DAO)与视图层(View)之间的事务管理问题。...然而,当我们在服务层关闭了Session后,到视图层进行数据填充时,可能会遇到已关闭...

    J2EE学习路线及重要知识点.pdf

    主要接口(尤其是Session),普通属性和关联关系映射,Native SQL,inverse lazy cascade,继承关系映射,HQL,性能优化(一级缓存,二级缓存,查询缓存),事务和并发控制(悲观锁,乐观锁),OpenSessionInView,...

    Hibernate学习笔记

    opensessioninview是另一种事务管理策略,它在Web应用中常用于管理事务。悲观锁和乐观锁是解决并发问题的两种策略,Hibernate也提供了相应的支持。 Hibernate与Java持久化API(JPA)的集成是通过annotation方式完成...

    JAVA自学之路 七路线图明细

    掌握实体属性映射,关联关系映射,Native SQL,inverse,lazy,cascade,继承关系映射,HQL,性能优化,一级缓存,二级缓存,查询缓存,事务管理,悲观锁和乐观锁,以及OpenSessionInView和CurrentSession。...

    Spring的学习笔记

    - **事务配置**:未配置事务可能导致openSessionInView模式下异常。 - **中文乱码**:需要配置字符编码以解决乱码问题。 **SSH整合的jar包** - **Struts2,Hibernate,Spring**:确保引入了所有必要的jar包,包括...

    java知识点汇总学习路线与笔记

    - **openSessionInView**:一种实现读取操作时的懒加载技术。 - **CurrentSession**:获取当前线程中的Session实例。 #### 十四、Spring - **Spring**:一个轻量级的Java开发框架,提供了依赖注入、面向切面编程等...

    SSH整合示例项目 hibernate5.2.3+struts2.5.2+spring4.3.3.zip

    SSH整合是Java Web开发中的一种经典技术栈,包括Spring、Struts和Hibernate三个核心框架。这个项目是一个基于最新版本SSH的示例应用,具体...开发者可以通过学习和实践这个项目,深入理解SSH整合的核心概念和实际运用。

    马士兵Spring学习笔记.docx

    #### 示例:OpenSessionInView Filter - **作用**:保持一个持久化上下文与HTTP请求的生命周期同步,以解决懒加载异常问题。 - **解决方案**:通过在Struts2配置文件中配置`OpenSessionInViewFilter`来实现。 ### ...

    java自学之路num1

    性能优化,一级缓存,二级缓存,查询缓存,事务管理(悲观锁、乐观锁),以及OpenSessionInView和CurrentSession策略。 9. **Spring**:IoC(控制反转)和DI(依赖注入)的核心概念,Spring的架构,AOP(面向切面...

    SSH整合笔记

    - OpenSessionInView 交由 Spring 管理; - SessionFactory 也交由 Spring 管理; - 事务提交和回滚交给 Spring 处理; - 业务层 Bean 交由 Spring 管理; - 数据访问层 Bean 交由 Spring 管理。 - **具体步骤...

    SSH项目整合示例【源码】

    以上就是SSH项目整合示例的核心内容,通过这个示例,开发者可以学习到如何将Struts2、Spring和Hibernate三个框架高效地结合在一起,构建出完整的Web应用程序。理解并熟练掌握这些知识,将有助于提升在Java Web开发...

    Spring配置总结

    ### Spring配置总结:深入解析与应用 #### 一、Spring框架概述 Spring是一个开源的Java平台框架,由Rod Johnson创建...通过对这些内容的学习和实践,可以极大地提升开发者在构建基于Spring框架的应用时的能力和效率。

    spring面试题集

    当遇到OpenSessionInView问题时,可以使用OpenSessionInViewFilter或OpenSessionInViewInterceptor来解决。 Spring的事务管理提供了强大且灵活的机制,主要包括编程式和声明式两种方式: 1. 编程式事务管理:通过...

    spring学习笔记

    目录 1.1 Spring 框架学习路线:...........................................................................................................................4 1.2 Spring 框架的概述:...........................

    ssh配置总结

    ### SSH配置总结与部署步骤详解 #### 一、SSH框架简介 SSH框架是Java Web开发领域内非常流行的一种组合框架,分别由Struts2、Spring和Hibernate三个技术组成。...希望对正在学习或使用SSH框架的开发者有所帮助。

    hibernate面试题总结

    Hibernate是Java领域中一款流行的持久化框架,它简化了与关系数据库之间的交互,提供了一种对象关系映射(ORM)的解决方案。以下是对面试中可能会遇到的...理解并掌握这些内容对于深入学习和使用Hibernate至关重要。

    SSH面试总结(非常全)

    ### SSH面试总结(非常全) #### Java面试宝典与SSH常问问题详解 在IT行业中,尤其是对于专注于Java开发的专业人士来说,掌握SSH框架(即Struts、...希望这份“SSH面试总结”能成为你在学习和职业道路上的有力助手。

Global site tag (gtag.js) - Google Analytics