hibernate缓存机制

来源:互联网 发布:古灵精怪的女生知乎 编辑:程序博客网 时间:2024/06/05 10:28

首先得理解缓存是什么,缓存是指临时文件交换区,可以理解为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>


0 0