hibernate缓存机制

本文通过生动的比喻解释了缓存的概念及其在减轻CPU负担方面的作用,并深入探讨了一级缓存和二级缓存的区别,以及Hibernate中如何实现这两种缓存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先得理解缓存是什么,缓存是指临时文件交换区,可以理解为cpu中的一个特定区域,

举个通俗一点的例子。

比如在学校上课,学生的所有书都放在家里,每天上学的时候,将所有书本都背到教室,等放学了,又要背回到家里面。

在这里,“家”就相当与数据库,是永久性存储的空间,而教室则相当与前台需求,学生则相当与执行者,也就是cpu,当然,中间的执行过程可以相当复杂,这里暂时撇到一边不说,

就单这个例子而言,天天如是,对学生会造成很大的负担,苦不堪言,于是我们就想了一个办法,在教室的课桌下面装上抽屉(缓冲区),让学生们把书本都放到里面,这样就省掉了天天

背的重担,但是抽屉大小有限,盛不下所有的课本,也就只能放一些每天都需要用的课本,而那些每周只用一两次或者很久才使用一次的课本,还需要放在家里面,等哪天需要这些课本,再背到学校。这样的话,就可以大大节省学生(cpu)的负担,可以让他们将更多的精力投入到学习中去。


hibernate默认支持一级缓存,不支持二级缓存,

一级缓存,就是指同一个session之内的缓存,二级缓存是同一个factory内的缓存,

缓存机制可以有效地节省资源,当hibernate执行sql查询的时候,会先到缓存之中寻找是否有这条或者这几条数据,如果有的话,会直接读取出来,而不用再去数据库中查询,

下面是一个测试,

package com.test;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.entity.User;
import com.util.HibernateUtil;

public class TestCache {

	public static void main(String[] args) {
		TestCache test = new TestCache();
		test.testCache1();

	}

	public void testCache1() {
		Session session = HibernateUtil.getSessionFactory().openSession();
		User user = (User) session.get(User.class, 2);
		System.out.println("-----------------------");
		User user2 = (User) session.get(User.class, 2);
		System.out.println(user == user2);
		System.out.println("=====================");// 同一个session之内的缓存叫做一级缓存;
		List<User> list = session.createQuery(" from User").list();
		for (int i = 0; i < list.size(); i++) {
			User user3 = list.get(i);
			if (user3.getId() == 2) {
				System.out.println(user3 == user);
			}
		}
		session.close();
	}

	public void testCache2() {
		// 同一个sessionFactory()之内的缓存叫做二级缓存,hibernate默认只支持一级缓存,想要支持二级缓存,需要借助插件
		Session session = HibernateUtil.getSessionFactory().openSession();
		User user = (User) session.get(User.class, 2);
		session.close();
		System.out.println("-----------------------");
		Session session2 = HibernateUtil.getSessionFactory().openSession();
		User user2 = (User) session2.get(User.class, 2);
		System.out.println(user == user2);
		System.out.println(user.getName()+"---"+user2.getName());
		session2.close();
	}

	public void testLoad() {
		Session session = HibernateUtil.getSessionFactory().openSession();
		User user = (User) session.load(User.class, 2);
		session.close();
		System.out.println("-----------------------");
		Session session2 = HibernateUtil.getSessionFactory().openSession();
		User user2 = (User) session2.load(User.class, 2);
		System.out.println(user == user2);
		session2.close();
	}
}

在这里,load方法是一个特殊的存在,有兴趣的朋友可以自己测试一下看看具体效果


至于二级缓存,并不常用,如果真的需要的话,需要在hibernate配置文件中设置,并且需要加一个jar包 “ehcache-1.2.3.jar”

<property name="hibernate.cache.use_second_level_cache">true</property>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值