`
wsckw5
  • 浏览: 27675 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

Hibernate呼叫Session的一点个人猜测

阅读更多

     SessionFactorySession现在感觉是Hibernate的精髓,却也容易误解.今天通过跨库出现错误感觉通了一点------Hibernate呼叫Session的顺序(当然有点猜测的味道)

     1)产生Session:一般的的当Dao被显示的使用时,由于Spring的管理他会调用getCurrentSession()来获得当前Session.

注释:这里感觉是一切罪恶的源头,如果你的DAO使用了hibernateTemplate的话在,在Spring配置中尼就会发现(至少我的项目是这样的):
<bean id="houseInfoDao" class="com.dgsoft.data.biz.info.dao.house.HouseDaoImpl">
      <property name="hibernateTemplate">
           <ref bean="hibernateTemplateInfo" />   //
注意这里的Info
     </property>
</bean>

<bean id="hibernateTemplateInfo" class="org.springframework.orm.hibernate3.HibernateTemplate">

       <property name="sessionFactory">

           <ref bean="sessionFactoryInfo" />//这个不用说就是Info所对应库sessionFactory

       </property>

       <property name="jdbcExceptionTranslator">//看命名是针对Jdbc异常

           <ref bean="jdbcExceptionTranslatorInfo" />

       </property>

</bean>

也就是说对于getCurrentSession()方法来说,他会先调用该Dao所属的SessionFactory看看里面有没有存在Session.这引出了第二步

 

2)查询该DAO所属的SessionFactory,查看里面是否有Session,有则返回该Session而没有则建立返回.显然的当不同的Dao显示调用时,能由于他们属于不同的库就会生成不同Session(SessionFactory不同就不可能生成相同的Session).这里可以简单的认为Session是这个库专有的,当你显示调用Dao是就会生成该库的专有session毕竟session也是connect的拥有者

 

3)由于显示调用Dao并且肯定对库进行操作因而会绑定事物,也就是说会死锁该库的部分数据,但是由于库与库之间有关系(主要是表与表的关联)其他库的专有Session可以通过这个关联操作该库数据(注意为什么说Session是库专有的是由于Session当访问其他库时必须通过关联若没有关联则无法访问这是有限制的。不过当他对对方库进行操作也会在对方库中添加事物------JTA产生的原因


 

这就是问题所在。当我有个Service中有两个Dao而他们不属于同一个库。而一个DaoA改变该库中的一个表A而另一个DaoB通过关联对表A进行操作,显然两个Session两个不同的事物,而不幸的是他们操作的是表A的同一条记录(事物最小级别好像就是”),因而你会很容易的发现出现了死锁.

解决方法:

         1)将两个库变为一个SessionFactory进行管理,由于只出来一个Session就不会出现两个事物之间死锁的问题!

         2)在查阅hibernateTemplate的信息时无意发现了一个方法public final void setSessionFactory(SessionFactory sessionFactory),也就是说对于DAO我们可以显示的绑定到指定的SessionFactory,这样如果临时的将DaoASessionFactory设成DaoB对应的,应该也能解决死锁问题.(就是不知道代价如何)

分享到:
评论

相关推荐

    Hibernate-nosession

    然而,在某些特定场景下,我们可能并不需要频繁地打开和关闭Session,这时“Hibernate-nosession”就显得尤为重要。本文将深入探讨Hibernate-nosession的概念、应用场景以及如何在实际代码中实现。 首先,理解什么...

    hibernate中session的管理

    在Hibernate框架中,Session是与数据库交互的主要接口,它负责对象的持久化操作。然而,由于Session不是线程安全的,所以在多线程环境中管理Session就需要特别注意。本篇文章将详细探讨Hibernate中Session的管理,...

    重写hibernate的session简单增删改查

    "重写hibernate的session简单增删改查"是一个针对初学者的实践教程,旨在帮助理解如何在Hibernate中自定义Session的操作,以便更好地控制数据库交互。 一、Hibernate Session Hibernate的Session是与数据库交互的...

    hibernate中session对象的状态详解

    hibernate中session对象的状态详解

    hibernate和session学习

    【hibernate与Session详解】 Hibernate 是一个强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中操作数据库的强大工具。通过Hibernate,我们可以将数据库中的表与Java类进行映射,从而实现对...

    Hibernate_Session_Transaction

    在Java的持久化框架Hibernate中,`Session`和`Transaction`是两个至关重要的概念,它们在数据管理和事务处理中起到核心作用。这篇文章将深入解析这两个概念及其相关知识点。 `Session`是Hibernate提供的一种与...

    Hibernate(session管理)

    本文将深入探讨Hibernate中的核心概念——Session管理。 首先,理解Session在Hibernate中的角色至关重要。Session是Hibernate的主要工作单元,它是应用程序与数据库之间的桥梁。它负责保存、检索和更新Java对象,...

    Hibernate的Session的javadoc

    Hibernate的Session接口是Java应用程序与Hibernate之间主要的运行时交互接口,它提供了对持久化对象的创建、读取和删除操作。Session的概念是基于对象的状态管理和数据库事务的,它的生命周期通常与一个物理事务绑定...

    org.hibernate.HibernateException: No Hibernate Session bound to thread

    Hibernate Session 绑定线程解决方案 在 Java web 开发中, Hibernate 是一个非常流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在使用 Hibernate 进行数据库操作时,...

    hibernate session生命周期示例

    本示例将深入探讨Hibernate Session的生命周期及其使用,帮助你更好地理解和运用这个强大的工具。 Hibernate Session是Hibernate的核心接口,它是与数据库交互的主要接口。Session对象负责管理实体对象的状态,包括...

    Hibernate_session_factory_配置.docx

    在Java的持久层框架Hibernate中,SessionFactory是核心组件之一,它是线程安全的,负责创建Session对象,每个Session对应于数据库的一次会话。配置SessionFactory主要是通过Hibernate的配置文件(通常为hibernate....

    Hibernate Session释放模式

    在Java的持久化框架Hibernate中,Session对象是与数据库交互的核心组件,它负责管理对象的持久状态。在处理大量数据或者长时间运行的事务时,合理地管理Session的生命周期至关重要,这就涉及到了Hibernate的Session...

    hibernate的session.flush

    在Java的持久化框架Hibernate中,`Session`是与数据库交互的核心接口,它扮演着连接应用程序和数据库的角色。`Session.flush()`方法是一个关键的操作,它强制Hibernate将内存中的对象状态同步到数据库,确保数据的...

    hibernate--3.Hibernate数据持久化(通过 Session 操纵对象)

    本篇文章主要关注如何通过Hibernate的Session接口来操纵对象,实现数据的持久化。 首先,我们需要理解Session在Hibernate中的角色。Session是Hibernate的核心接口之一,它负责对象的持久化操作,比如保存、更新、...

    实现自己的Hibernate框架之Session 方法实现

    本篇文章将深入探讨如何实现自己的Hibernate框架,特别是Session方法的实现,这对于理解ORM的工作原理及优化数据库访问逻辑具有重要意义。 首先,我们需要了解Hibernate的核心概念——Session。在Hibernate中,...

    hibernate的核心接口--Session

    ### Hibernate的核心接口——Session详解 #### 一、Session简述 **1. Session概念** - **定义**: Session 是 Hibernate 框架中最常用的接口之一,它又被称为持久化管理器。Session 负责所有与数据库交互的工作,...

    详解Hibernate呼叫Oracle的存贮过程和函数

    本示例演示Hibernate 3.2呼叫Oracle的存贮过程和函数,以及通过Hibernate的Query接口简化JDBC的开发步骤--两个步骤得到List集合。使用这种方式开发可以要求开发人员不需要太了解Hibernate框架,但是需要开发人员非常...

    hibernate关于session的关闭实例解析

    关于 Hibernate 中 Session 的关闭实例解析 Hibernate 是一个流行的 Java 持久层框架,它提供了许多强大功能来管理数据库交互。Session 是 Hibernate 中的一种基本概念,它扮演着关键角色来管理数据库交互。本文将...

    Hibernate_11session

    《深入理解Hibernate Session:从配置到实践》 Hibernate,作为Java领域中一款广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作。在Hibernate中,Session是连接应用程序和数据库的重要桥梁,它负责对象...

    hibernate02:session对象、hql查询、在线查询也叫对象查询、离线查询

    本话题主要聚焦于`Hibernate02`,涵盖`Session`对象、HQL(Hibernate Query Language)查询以及在线查询和离线查询的概念。 首先,我们来详细讨论`Session`对象。在Hibernate中,`Session`是应用程序与数据库之间的...

Global site tag (gtag.js) - Google Analytics