SessionFactory与Session现在感觉是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,这样如果临时的将DaoA的SessionFactory设成DaoB对应的,应该也能解决死锁问题.(就是不知道代价如何)
分享到:
相关推荐
然而,在某些特定场景下,我们可能并不需要频繁地打开和关闭Session,这时“Hibernate-nosession”就显得尤为重要。本文将深入探讨Hibernate-nosession的概念、应用场景以及如何在实际代码中实现。 首先,理解什么...
在Hibernate框架中,Session是与数据库交互的主要接口,它负责对象的持久化操作。然而,由于Session不是线程安全的,所以在多线程环境中管理Session就需要特别注意。本篇文章将详细探讨Hibernate中Session的管理,...
"重写hibernate的session简单增删改查"是一个针对初学者的实践教程,旨在帮助理解如何在Hibernate中自定义Session的操作,以便更好地控制数据库交互。 一、Hibernate Session Hibernate的Session是与数据库交互的...
hibernate中session对象的状态详解
【hibernate与Session详解】 Hibernate 是一个强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中操作数据库的强大工具。通过Hibernate,我们可以将数据库中的表与Java类进行映射,从而实现对...
在Java的持久化框架Hibernate中,`Session`和`Transaction`是两个至关重要的概念,它们在数据管理和事务处理中起到核心作用。这篇文章将深入解析这两个概念及其相关知识点。 `Session`是Hibernate提供的一种与...
本文将深入探讨Hibernate中的核心概念——Session管理。 首先,理解Session在Hibernate中的角色至关重要。Session是Hibernate的主要工作单元,它是应用程序与数据库之间的桥梁。它负责保存、检索和更新Java对象,...
Hibernate的Session接口是Java应用程序与Hibernate之间主要的运行时交互接口,它提供了对持久化对象的创建、读取和删除操作。Session的概念是基于对象的状态管理和数据库事务的,它的生命周期通常与一个物理事务绑定...
Hibernate Session 绑定线程解决方案 在 Java web 开发中, Hibernate 是一个非常流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在使用 Hibernate 进行数据库操作时,...
本示例将深入探讨Hibernate Session的生命周期及其使用,帮助你更好地理解和运用这个强大的工具。 Hibernate Session是Hibernate的核心接口,它是与数据库交互的主要接口。Session对象负责管理实体对象的状态,包括...
在Java的持久层框架Hibernate中,SessionFactory是核心组件之一,它是线程安全的,负责创建Session对象,每个Session对应于数据库的一次会话。配置SessionFactory主要是通过Hibernate的配置文件(通常为hibernate....
在Java的持久化框架Hibernate中,Session对象是与数据库交互的核心组件,它负责管理对象的持久状态。在处理大量数据或者长时间运行的事务时,合理地管理Session的生命周期至关重要,这就涉及到了Hibernate的Session...
在Java的持久化框架Hibernate中,`Session`是与数据库交互的核心接口,它扮演着连接应用程序和数据库的角色。`Session.flush()`方法是一个关键的操作,它强制Hibernate将内存中的对象状态同步到数据库,确保数据的...
本篇文章主要关注如何通过Hibernate的Session接口来操纵对象,实现数据的持久化。 首先,我们需要理解Session在Hibernate中的角色。Session是Hibernate的核心接口之一,它负责对象的持久化操作,比如保存、更新、...
本篇文章将深入探讨如何实现自己的Hibernate框架,特别是Session方法的实现,这对于理解ORM的工作原理及优化数据库访问逻辑具有重要意义。 首先,我们需要了解Hibernate的核心概念——Session。在Hibernate中,...
### Hibernate的核心接口——Session详解 #### 一、Session简述 **1. Session概念** - **定义**: Session 是 Hibernate 框架中最常用的接口之一,它又被称为持久化管理器。Session 负责所有与数据库交互的工作,...
本示例演示Hibernate 3.2呼叫Oracle的存贮过程和函数,以及通过Hibernate的Query接口简化JDBC的开发步骤--两个步骤得到List集合。使用这种方式开发可以要求开发人员不需要太了解Hibernate框架,但是需要开发人员非常...
关于 Hibernate 中 Session 的关闭实例解析 Hibernate 是一个流行的 Java 持久层框架,它提供了许多强大功能来管理数据库交互。Session 是 Hibernate 中的一种基本概念,它扮演着关键角色来管理数据库交互。本文将...
《深入理解Hibernate Session:从配置到实践》 Hibernate,作为Java领域中一款广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作。在Hibernate中,Session是连接应用程序和数据库的重要桥梁,它负责对象...
本话题主要聚焦于`Hibernate02`,涵盖`Session`对象、HQL(Hibernate Query Language)查询以及在线查询和离线查询的概念。 首先,我们来详细讨论`Session`对象。在Hibernate中,`Session`是应用程序与数据库之间的...