zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Hibernate一级缓存

2023-09-14 09:02:01 时间

Hibernate的一级缓存就是指session缓存。

actionQueue它是一个行列队列,它主要记录crud操作的相关信息
persistenceContext它是持久化上下文,它其实是真正缓存。
在session中定义了一系列的集合来存储数据,它们构成session缓存。
只要session没有关闭,它就会一直存在。
当我们通过hibernate中的session提供的一些API例如 save get update等进行操作时,就会将持久化对象保存到session中,当下一次在去查询缓存中具有的对象(OID值来判断),
就不会去从数据库查询,而是直接从缓存中获取。
Hibernate的一级缓存存在的目的就是为了减少对数据库访问。

在hibernate中还有一个二级缓存,它是SessionFactory级别缓存。

// 测试一级缓存
@Test
public void test3() {
    // 1.得到session
    Session session = HibernateUtils.openSession();
    session.beginTransaction();

    Customer c = session.get(Customer.class, 1); // 查询id=1的customer对象,如果查询到,会将c存储到一级缓存中。
    Customer cc = session.get(Customer.class, 1); // 会从一级缓存
                                                    // 中查询,而不会向数据库在发送sql

    // 2.事务提供,关闭
    session.getTransaction().commit();
    session.close();
}

演示一级缓存的存在

HibernateUtils工具类

public class HibernateUtils {

    private static Configuration config;
    private static SessionFactory sessionFactory;

    static{

        config=new Configuration().configure();
        sessionFactory=config.buildSessionFactory();
    }

    public static Session openSession(){
        return sessionFactory.openSession();
    }
}

持久化对象具有自动更新数据库能力

// 持久化对象具有自动更新数据库能力
    @Test
    public void test4() {
        // 1.得到session
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        Customer c = session.get(Customer.class, 1); // 查询id=1的customer对象,如果查询到,会将c存储到一级缓存中。
        c.setName("tom"); // 操作持久化对象来修改属性
        // 2.事务提供,关闭
        session.getTransaction().commit();
        session.close();
    }

这里写图片描述