2.3 hibernate的一级缓存和快照机制

什么是缓存

内存中的临时数据

为什么使用缓存

减少和数据库交互的次数,从而提高查询效率

什么数据适用于缓存

适用:经常查询,并且不经常修改,同时数据一旦出现问题对最终结果影响不大
不适用:不管经常查询,只要是经常修改得,都可以不用缓存,并且数据出现问题对结果影响很大,例如银行汇率,商品库存,股市牌价。

hibernate的一级缓存

指的是Session对象的缓存,一旦Session对象销毁了,一级缓存就消失了

package com.itheima.domain;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import com.itheima.utils.HibernateUtils;

/*
 * hibernate的一级缓存
 * */
public class HibernateDemo2 {
    /*
     * 证明一级缓存确实存在
     * */
    @Test
    public void test1() {
        Session s = HibernateUtils.openSession();
        Transaction tx = s.beginTransaction();
        //根据id查询客户
        Customer c1 = s.get(Customer.class,1L);
        System.out.println(c1);
        Customer c2 = s.get(Customer.class,1L);
        //先去一级缓存中看看有没有,有的话,直接拿来用,没有的话再查询
        System.out.println(c2);
        //true
        System.out.println(c1 == c2);
        tx.commit();
        s.close();//session关闭,以及缓存就消失了
        
    }
    
}

image.png

快照

@Test
    public void test2() {
        Session s = HibernateUtils.openSession();
        Transaction tx = s.beginTransaction();
        //根据id查询客户
        Customer c5 = s.get(Customer.class,5L);
        System.out.println(c5.getCustAddress());//输出客户地址
        
        //修改客户地址为秦皇岛哈哈
        c5.setCustAddress("秦皇岛哈哈");
        System.out.println(c5.getCustAddress());
        
        //没写update语句
        tx.commit();
        s.close();//session关闭,以及缓存就消失了
        
        //c5能用吗
        System.out.println(c5.getCustAddress());
    }
image.png

2.3 hibernate的一级缓存和快照机制_第1张图片
image.png

你可能感兴趣的:(2.3 hibernate的一级缓存和快照机制)