Hibernate的一级缓存和二级缓存(七)

简介: Hibernate的一级缓存和二级缓存(七)

一. Hibernate的一级缓存


20181020183851571.png


2018102019232881.png


20181020192354619.png


一级缓存的范围是Session。


一级缓存的特点,只在session范围有效,作用时间短,效果不是特别明显,在短时间内多次操作数据库,效果比较明显。


二. 一级缓存的测试


@Test
  public void cacheTest(){
    Session session=HibernateUtil.getSession();
    User user1=session.get(User.class,8);
    User user2=session.get(User.class,8);
    System.out.println(user1==user2);
    session.flush();
  }


查看控制台:


20181020192637502.png


只执行了一条语句,返回值为true。 即说明,只从数据库中中查询了一次。

只查询一次,是因为快照区的作用.


2018102019273845.png


Session关闭后,不能使用懒加载数据,如果session关闭后,使用懒加载数据报错


三.Hibernate的二级缓存


Hibernate提供了基于应用程序级别的缓存即为二级缓存,可以跨多个session,即不同的session都可以访问缓存数据。 这个缓存也叫二级缓存。


Hibernate提供的二级缓存有默认的实现,且是一种可插配的缓存框架!如果用户想用二级缓存,只需要在hibernate.cfg.xml中配置即可; 不想用,直接移除,不影响代码。


 如果用户觉得hibernate提供的框架框架不好用,自己可以换其他的缓存框架或自己实现缓存框架都可以。 


什么样的数据,适合放在二级缓存中呢?


1. 很少被修改的数据

2. 不是很重要的数据,允许出现偶尔并发的数据

3. 不会被并发访问的数据

4. 参考数据


什么样的数据,不适合放在二级缓存中呢?


 1. 经常被修改的数据

 2. 财务数据,绝对不允许出现并发

 3. 与其他应用共享的数据。


四. 如何开启二级缓存


Hibernate的一级缓存是默认开启的,二级缓存则需要自己手动进行开启。


四.一 添加EhcacheJar包


将Hibernate安装包下的Jar包,在hibernate-release-5.2.17.Final\lib\optional\ehcache


201810201939439.png


20181020194038369.png


四.二 在hibernate.cfg.xml中添加配置


   <!-- 开启二级缓存 -->
        <property name="hibernate.cache.use_second_level_cache">true</property>
        <property name="hibernate.cache.region.factory_class ">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
        <!-- 配置RegionFactory为Ehcache的RegionFactory -->
        <property name="hibernate.cache.use_second_level_cache">true</property>
        <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>


Ctrl+鼠标,可以点击进去。


四.三 添加ehcache.xml文件


在src下添加ehcache.xml文件,内容是:


<ehcache>
    <diskStore path="java.io.tmpdir"/>
    <defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        overflowToDisk="true"
        />
</ehcache>


四.四 在要缓存的User.hbm.xml文件中添加


<class name="User" table="user" lazy="true">
    <!-- 添加二级缓存 -->
     <cache usage="read-write" /><!-- 二级缓存配置  只读时为read-only -->
    <!-- 主键 -->
    <id name="id" column="id">
      <generator class="native"></generator>  
    </id>
    .....
</class>


四.五 进行测试


@Test
  public void cache2Test(){
    Session session=HibernateUtil.getSession();
    User user1=session.get(User.class,8);//第一次查询语句
    User user2=session.get(User.class,8);//不会查询语句
    System.out.println(user1==user2);
    System.out.println("user1:"+user1);
    session.close();
    Session session2=HibernateUtil.getSession();
    User user3=session2.get(User.class,8);//不查询语句
    System.out.println("user3:"+user3);
    session.close();
  }


控制台输出为:


20181020195217475.png


只有一条查询语句,其中user1与user2相同,但是user1与user3不一样。


谢谢!!!

相关文章
|
1月前
|
SQL 缓存 Java
如何判断mybatis 开启二级缓存 和二级缓存详细讲解
如何判断mybatis 开启二级缓存 和二级缓存详细讲解
77 0
|
10月前
|
SQL 存储 缓存
Mybatis的一级缓存,二级缓存过期时间分析
Mybatis的一级缓存,二级缓存过期时间分析
372 0
|
1月前
|
XML 缓存 Java
MyBatis二级缓存解密:深入探究缓存机制与应用场景
MyBatis二级缓存解密:深入探究缓存机制与应用场景
157 2
MyBatis二级缓存解密:深入探究缓存机制与应用场景
|
10月前
|
存储 SQL 缓存
MyBatis一级缓存 二级缓存
MyBatis一级缓存 二级缓存
68 0
|
6月前
|
缓存 Java 数据库连接
Mybatis中一级缓存和二级缓存使用详解
Mybatis中一级缓存和二级缓存使用详解
83 0
|
8月前
|
缓存 Java 数据库连接
mybatis之一级缓存和二级缓存~
mybatis之一级缓存和二级缓存~
|
9月前
|
缓存 Java 数据库连接
MyBatis 的一级缓存和二级缓存
MyBatis 的一级缓存和二级缓存
162 0
|
9月前
|
存储 缓存 Java
Spring为何需要三级缓存解决循环依赖,而不是二级缓存?
今天给大家分享一道大厂面试真题,Spring为何需要三级缓存解决循环依赖,而不是二级缓存?我一共分为五个部分来给大家介绍: 1、什么是循环依赖? 循环依赖就是指循环引用,是两个或多个Bean相互之间的持有对方的引用。在代码中,如果将两个或多个Bean互相之间持有对方的引用,因为Spring中加入了依赖注入机制,也就是自动给属性赋值。Spring给属性赋值时,将会导致死循环。那么,哪些情况会出现循环依赖呢?
161 0
|
10月前
|
SQL XML 缓存
mybatis的一级缓存和二级缓存
mybatis的一级缓存和二级缓存
95 0
|
10月前
|
缓存 Java 数据库连接
提高检索效率的利器--Mybatis 的一级缓存和二级缓存执行顺序
提高检索效率的利器--Mybatis 的一级缓存和二级缓存执行顺序
74 0