Hibernate中的Session缓存问题

1. Session 缓存:

1) . 在 Session 接口的实现中包括一系列的 Java 集合 , 这些 Java 集合构成了 Session 缓存 .

用于存放 Session 关联的对象( Session 关联对象的方式有非常多种。

比如:session.get (Class , OID )、 session.update()、 session.save ()  ...)。

仅仅要 Session 实例没有结束生命周期 , 且没有清理缓存。则存放在它缓存中的对象也不会结束生命周期。

Session 缓存可降低 Hibernate 应用程序訪问数据库的频率。

2) . 操作 Session 缓存的方法(了解一下吧)。

①. 若调用 session.get () 从数据库中载入一个对象。则该对象会被纳入到 Session 缓存中。

News news = (News ) session.get (News.class , 1);

//会向数据库发送 SQL 吗 ? 不会发送 SQL 语句 , 而是从 Session 缓存获取对象的引用(快照)

News news2 = (News ) session.get (News.class , 1);

②. Session 的 clear() 方法能够清空 Session 的缓存

News news = (News) session.get(News.class, 1);

//清理  
session 缓存

session.clear ();

//会向数据库发送 SQL 吗 ? 会 ! 由于 Session 缓存被清空了 !

News news2 = (News ) session.get (News.class , 1);

③. Session 的 flush() 方法:

清理缓存 - 强制使数据库记录和 Session 缓存中对象状态保持一致,可能会发送 SQL 语句

(若数据库记录和 Session 中对象状态不一致。则发送 SQL。否则不发送 SQL)

I. 默认情况下,提交事务时,会先清理缓存。然后再提交事务

II. 若主键生成方式使用的是数据库底层的自增长方式。会在运行 Session 的 save() 方法时,就清理缓存,运行 INSERT 语句。而不是等到提交事务时。 Hibernate 要求和 Session 关联的对象必须有和数据表记录相应的 OID,这就意味着运行 save() 方法后。必须有 OID ,而底层自增长的方式生成主键,必须先运行 INSERT 才干获取主键值

//若使用 MySQL 底层自增的方式生成主键, save() 方法即会引起发送 INSERT 语句

session.save (news );

System.out.println (news.getId ());

III. 使用 HQL(Hibernate
Query Language )查询记录时,不经过 Session 缓存!直接查询数据库,且要求查询的结果是最新的。

所以,在进行 HQL 查询之前须要先清理缓存

session.save(news);

//会导致清理缓存

News news2 = (News) session.createQuery ("FROM
News n WHERE n.id = ?" )

.setInteger (, news.getId ()).uniqueResult ();

IV. commit() 和 flush() 方法的差别:

flush 运行一系列 sql 语句,但不提交事务;

commit 方法先调用flush() 方法,然后提交事务 . 意味着提交事务对数据库的操作永久保存下来。

④.
refresh () 方法:

强制使 Session 缓存中的对象的状态和数据库记录保持一致。

所以会强制发送一条 SELECT 语句。

注意,由于 MySQL 的默认的隔离级别为 READ
REPTABLE 。所以须要设置事务的隔离级别才干看到实验的效果

<!-- 设置 Hibernate 的事务的隔离级别, 设置为读已提交 -->

<property
name ="connection.isolation" ></property >

时间: 2024-12-25 23:57:25

Hibernate中的Session缓存问题的相关文章

详解Hibernate中的一级缓存

1.前言 在Hibernate中有三级缓存,本篇博客先详细的介绍一下,Hibernate中的一级缓存,也就是Session级别的缓存. 2.持久化对象 如果要说到Hibernate的缓存的话,那么首先咱得提一下hibernate中的持久化对象. 其中持久化对象有三种状态,分别是: transient(瞬时态):尚未与Session关联对象,失去引用的话,就会被JVM回收.一般就是直接New创建的对象. persistent(持久态):已经与当前session产生关联,并且相关联的session没

第四讲 :hibernate中的session

hibernate中的session中可以进行增删改差,通过工具类可以得到相关的工具类. 方法概要:  Transaction beginTransaction()开始一个工作单元,得到关联的事务对象.  void cancelQuery()取消当前执行的查询.  void clear()彻底清除session.  Connection close()通过断开JDBC连结结束 Session和清除.  Connection connection() 得到JDBC连结  boolean conta

具体解释Hibernate中的二级缓存

1.前言 这篇博客再前几篇博客的基础上来解说一下.Hibernate中的二级缓存.二级缓存是属于SessionFactory级别的缓存机制. 第一级别的缓存是Session级别的缓存,是属于事务范围的缓存,由Hibernate管理,一般无需进行干预.第二级别的缓存是SessionFactory级别的缓存.是属于进程范围的缓存. 2.Hibernate二级缓存 1.分类 二级缓存也分为了两种 内置缓存:Hibernate自带的,不可卸载,通常在Hibernate的初始化阶段,Hibernate会把

Hibernate中延迟加载和缓存

什么是延迟加载? 延迟加载是指当应用程序想要从数据库获取对象时(在没有设置lazy属性值为false),Hibernate只是从数据库获取符合条件的对象的OId从而生成代理对象,并没有加载出对象 访问该对象的属性时才会加载出相应的值.简答来说就是尽可能的减少查询的数据量. 如何配置延迟加载 在Hibernate中通过.hbm配置文件中的lazy属性来陪值,并且lazy属性出现的位置不同其作用和取值也不同.下面来详细介绍其在不同位置的不同取值和作用 类Class标签中的lazy: 在类标签Clas

在Spring、Hibernate中使用Ehcache缓存(2)

这里将介绍在Hibernate中使用查询缓存.一级缓存.二级缓存,整合Spring在HibernateTemplate中使用查询缓存.,这里是hibernate3,使用hibernate4类似,不过不用hibernatetemplate,直接        Query query = getSession().createQuery(hql);        //开启二级缓存        query.setCacheable(true); EhCache是Hibernate的二级缓存技术之一,

详解Hibernate中的二级缓存

1.前言 这篇博客再前几篇博客的基础上来讲解一下,Hibernate中的二级缓存,二级缓存是属于SessionFactory级别的缓存机制.第一级别的缓存是Session级别的缓存,是属于事务范围的缓存,由Hibernate管理,一般无需进行干预.第二级别的缓存是SessionFactory级别的缓存,是属于进程范围的缓存. 2.Hibernate二级缓存 1.分类 二级缓存也分为了两种 内置缓存:Hibernate自带的,不可卸载,通常在Hibernate的初始化阶段,Hibernate会把映

hibernate中的一级缓存与闪照区

首先Hibernate中的一级缓存默认是打开的,并且范围从session创建到session关闭,存储的数据必须是持久态的数据. 1 //从session创建开始,一级缓存也跟着创建 2 Session session = HibernateSessionFactory.getSession(); 3 ... 4 //到session关闭,一级缓存 5 session.close(); 一级缓存的执行流程: 如果现在需要获得一个数据库里面的账号为“980517”的用户,执行Java代码 1 Us

Hibernate中的Session

1.Hibernate中的Session指的是什么? Session可以理解为一个可以操作数据库的对象. 2.可否将单个的Session在多个线程间进行共享? Session代表着Hibernate所做的一小部分工作,它负责维护者同数据库的链接而且不是线程安全的,也就是说,Hibernage中的Session不能在多个线程间进行共享.虽然Session会以主动滞后的方式获得数据库连接,但是Session最好还是在用完之后立即将其关闭.

hibernate中SessionFactory,Session的理解?

Session接口         Session接口对于Hibernate   开发人员来说是一个最重要的接口.然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会占用很多资源.这在实际项目 中确实很重要,因为在客户程序中,可能会不断地创建以及销毁Session对象,如果Session的开销太大,会给系统带来不良影响.但值得注意的是 Session对象是非线程安全的,因此在你的设计中,最好是一个线程只创建一个Session对象.         在Hibern