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