欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

03-Hibernate的Session缓存(一级缓存)

程序员文章站 2022-06-19 13:52:14
...

Session缓存

  在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存。只要 Session 实例没有结束生命周期,且没有清理缓存,则存放在它缓存中的对象也不会结束生命周期。
  Session 缓存可减少 Hibernate 应用程序访问数据库的频率。

利用反射查询对象:

  @Test
  public void testCache(){
      News news = session.get(News.class, 1);
      System.out.println(news );

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

      System.out.println(news==news2);
  }

结果如下:
03-Hibernate的Session缓存(一级缓存)
  两次获取News对象,只发送了一条查询语句。这就是Session缓存,也就是一级缓存。位于缓存中的数据叫做持久化对象。
  站在持久化角度,Hibernate将缓存分了4种状态:持久化、临时、游离、删除。

Session有3个缓存方法:
03-Hibernate的Session缓存(一级缓存)

1、flush()方法

  作用:使数据表中的记录和session缓存中的对象的状态保持一致,会发送对应的SQL语句,但不会提交事务。

为了确保数据一致,在以下会调用flush()方法:
1)显示的调用。session.flush();
2)事务提交的时候,会先调用flush(),然后再提交事务。
3)执行HQL或QBC查询。
4)若记录的ID是native(底层数据库自增的形式)生成的,在调用save()方法后,立即发送insert语句。

2、refresh()方法

  作用:会强制发送SELECT语句,以使session缓存中对象的状态和数据表中对应的记录保持一致。

打上断点,debug测试:
03-Hibernate的Session缓存(一级缓存)
修改数据库中的数据:Php——>Java
03-Hibernate的Session缓存(一级缓存)
得到的结果还是一样,而且也没有强制发送SQL语句。
03-Hibernate的Session缓存(一级缓存)
使用了refresh()方法后:
03-Hibernate的Session缓存(一级缓存)
在Hibernate中设置隔离级别:
  mysql的默认隔离级别是REPEATABLE READ,Oracle的默认隔离级别是READ COMMITED。
  JDBC 数据库连接使用数据库系统默认的隔离级别. 在 Hibernate 的配置文件中可以显式的设置隔离级别. 每一个隔离级别都对应一个整数:

  1. READ UNCOMMITED
  2. READ COMMITED
  3. REPEATABLE READ
  4. SERIALIZEABLE

  Hibernate 通过为 Hibernate 映射文件指定 hibernate.connection.isolation 属性来设置事务的隔离级别

3、clear()

  作用:清除缓存。

03-Hibernate的Session缓存(一级缓存)
03-Hibernate的Session缓存(一级缓存)

相关标签: javaEE