`

hiernate 集中管理session

阅读更多
问题:
     使用hibernate 一般会使用到hibernate的延迟加载技术,但是我在第一次使用延迟加载的时候,发现报错,不能取出延迟集合中的值。当时只能不使用延迟加载。
原因:
    在dao层把数据取出后,已关闭session,而处理延迟的集合是在业务逻辑层,在需要使用延迟的集合的时候,hibernate会去数据库取数据。但是现在session已经关闭,所以不能取出延迟的数据。
解决:
   在后来研读hibernate相关书籍的时候,才发现在使用session的集中管理可以解决这一问题。集中管理方式,较多的为ThreadLoad模式,ThreadLoad会把session与当前线程绑定。在当前线程创建时,创建session。在当前线程结束时,关闭session。
   在spring和hibernate共同使用的应用中,集中管理一般分为:1、在一次请求中打开一个session,2、在一次事物中打开一个session。
   一、 在一次请求中打开一个session:是在一个http请求开始的时候创建一个sessio并绑定到ThreadLoad中,在这个请求返回之前一直保持session打开。从而使这个session在整个请求期间都可以使用。
   在web.xml中添加
  
     <filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInviewFilter</filter-class>
    <init-param>
      <param-name>singleSession</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  
  <filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
   

   缺点:如果请求在某一节点被阻塞,在此期间session资源会一直占用而不释放掉,如果冰法较大,会造成系统宕机,如果某一步发生异常也会导致session没有正常关闭.
   二、在一个事物中打开一个session:在开始一个事物之前创建session,并把session绑定到当前事物。当事物提交或者回滚时,就会释放当前相关的session,并关闭session。
   使用该中session集中管理,需要在代码中实现。
  
     Session session = getSession();
     boolean existingTransaction =    SessionFactoryUtils.isSessionTransactional(session,getSessionFactory());
     FlushMode previousFlushMode = null;
     try{
      ...
      return result;
     }cathch(Exception e){
        ....
     }finally{
       if(existingTransaction ){
        disableFilters(session);
        if(previousFlushMode != null){
         session.setFlushMode(previousFlushMode );
        }
      }else{
         SessionFactoryUtils.releaseSession(session,getSessionFactory());
      }
    }
   

两种那个更合适,需要自己取舍,在一个事物中打开一个session不会出现宕机,但是在一个请求中,可能会有多个事物,会多次连接数据库。
分享到:
评论

相关推荐

    hiernate5.2 .12 api

    2. **Session**:Session是Hibernate的主要工作单元,用于与数据库交互。它可以执行CRUD操作,管理对象的状态,并支持事务处理。 3. **实体(Entity)**:在Hibernate中,实体是数据库表的映射,通过@Entity注解...

    hiernate+jar1.zip

    1. **Hibernate Core**:这是Hibernate的核心模块,包含了ORM的主要功能,如实体管理、会话管理、查询语言等。 2. **JTA(Java Transaction API)**:用于处理事务管理,确保数据的一致性和完整性。 3. **JDBC驱动**...

    Flex整合Hiernate的BBS论坛系统

    Flex整合Hiernate的BBS论坛系统 Flex整合Hiernate的BBS论坛系统 Flex整合Hiernate的BBS论坛系统Flex整合Hiernate的BBS论坛系统 Flex整合Hiernate的BBS论坛系统 Flex整合Hiernate的BBS论坛系统 Flex整合Hiernate的BBS...

    hiernate 3.6.10 api

    hiernate 3.6.10 api chm

    学生成绩管理系统struts2+spring+hiernate+dwr+jquery UI

    《基于Struts2+Spring+Hibernate+DWR+jQuery UI的学生成绩管理系统详解》 在信息化时代,教育管理系统的建设对于提升教学效率、优化管理流程具有重要意义。本项目——"学生成绩管理系统",采用了一种先进的技术栈,...

    Hiernate课件

    ### Hiernate课件知识点详述 #### 一、Hibernate简介 **1.1 什么是Hibernate?** Hibernate是一个开源框架,能够自动地根据XML完成对象关系映射(ORM),并将对象持久化到数据库中。它是连接Java应用程序和关系...

    spring2.5.6 +struts2.1.8+hiernate3.3.2(jar)

    标题中的"spring2.5.6 +struts2.1.8+hiernate3.3.2(jar)"指的是一个集成开发环境,它包含了三个关键的Java Web框架:Spring 2.5.6、Struts 2.1.8和Hibernate 3.3.2。这些框架在Java应用开发中扮演着重要的角色,尤其...

    jsp_spring_dao_hiernate_spring登录_truthf1m_

    你可以通过配置Hibernate的实体类来表示数据库中的用户表,然后使用`SessionFactory`和`Session`对象来执行SQL查询,验证用户提供的凭据是否有效。 项目名称中的"truthf1m"可能是项目的一个特定标识或模块,但没有...

    hibernate各种常用方法的详解

    #### 二、Hibernate 对象状态管理 在 Hibernate 中,对象的状态主要包括以下三种: 1. **瞬时态(Transient)**:指新创建的对象尚未与任何 Session 关联,也未被持久化到数据库中。 2. **持久态(Persistent)**...

    struts+hiernate+Spring+ajax(四)整合

    "Struts+Hibernate+Spring+Ajax"的整合是Java Web开发中一个经典且广泛采用的组合,它涵盖了MVC(Model-View-Controller)框架、持久层管理、依赖注入以及异步数据交互等多个方面。现在,我们来详细探讨这个整合中的...

    xfire集成spring+hiernate实现webservice样例工程

    XFire与Spring的集成使得Web服务的创建和管理变得更加简洁,因为Spring可以处理依赖注入和事务管理等任务。Spring框架是企业级Java应用的核心,提供了全面的基础设施,包括IoC(Inversion of Control,控制反转)和...

    案例课程B-S架构-1期 详细设计书13-签报管理模块.pdf

    签报管理模块是OA系统中的一个重要组成部分,负责处理签报的录入、修改、查询、删除等操作。这个模块的设计遵循了MVC(Model-View-Controller)架构模式,确保了系统的可扩展性和可维护性。 在MVC架构中,View层...

    Strtus2+spring+hibernate

    这个架构整合了MVC(Model-View-Controller)设计模式、依赖注入(DI)与面向切面编程(AOP)以及持久化管理,为开发者提供了强大的工具集。 **Struts2** 是一个基于MVC设计模式的Web应用框架,它主要用于控制应用...

    用户管理_SSH(Strtus2+hibernate+spring)

    利用Strtus2+hibernate+spring实现的用户管理小项目(内含mysql数据库脚本和所需的所有jar包),另外里面自己也做了一些封装,这个项目的说明可以参考我发表的博客"对SSH的一些认知

    jsf 1.2_04+hibernate 3.2.2.ga+spring 2.0.5

    Spring通过依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)来管理组件间的依赖关系,并提供事务管理等功能。在本例中,虽然没有详细展示业务逻辑代码,但可以想象Spring...

    案例课程B-S架构-1期 详细设计书19-收文管理模块.pdf

    【收文管理模块详细设计】 收文管理模块是企业信息化办公自动化(OA)系统中的一个重要组成部分,主要用于处理和管理组织内部的收文流程。在这个模块中,收文的录入、修改、查阅和删除等操作都能得以实现。设计遵循...

    Hiernate里get和load的区别

    `session.get(Class clazz, Serializable id)` 这个方法直接从数据库中查询指定ID的对象。如果数据库中存在对应的记录,它将返回该对象。如果不存在,`get` 方法会简单地返回 `null`。这相当于执行一个SQL的SELECT...

    addAddress

    描述中的"strut1.2+hiernate3.1+myeclipse"揭示了开发环境和技术栈。Struts 1.2是Web层的框架,负责处理用户请求并调用业务逻辑。Hibernate 3.1则是持久层框架,用于对象关系映射(ORM),使得开发者可以使用面向...

Global site tag (gtag.js) - Google Analytics