Hibernate基本特性之一级缓存机制
一级缓存被称为Session级别的缓存。(默认启用)
每个Session都有自己独立的缓存区,该缓存区随着Session创建而开辟,随着Session.close()而释放。
该缓存区可以存储当前Session关联的对象(持久对象)。
一级缓存的好处:
Hibernate在查询时,先去缓存查找,如果缓存没有才去DB查询。如果利用Session对同一个对象查询多次,第一次去DB,后续会从缓存中获取,从而减少与DB的交互次数。
管理一级缓存的方法:
session.evict(obj);//将obj清除
session.clear();//清除所有对象
session.close();//清除所有对象并关闭与数据库的连接
示例代码:
package test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import util.HibernateUtil;
import entity.Foo;
/**
* 测试Hibernate一级缓存
*
*/
public class TestCache {
//@Test
public void test1(){
Session session = HibernateUtil.openSession();
Foo foo = (Foo) session.load(Foo.class,1);
System.out.println("foo:"+foo.getName());
//此次没有触发查询,而是从缓存中查找
Foo foo2 = (Foo) session.load(Foo.class,1);
System.out.println("foo2:"+foo2.getSalary());
session.close();
}
@Test
public void test2(){
Session session = HibernateUtil.openSession();
Foo foo = (Foo) session.load(Foo.class,1);
System.out.println("foo:"+foo.getName());
//session.evict(foo);//将foo从缓存中清除
session.clear();//清除所有缓存
//还会从数据库中查询
Foo foo2 = (Foo) session.load(Foo.class,1);
System.out.println("foo2:"+foo2.getSalary());
session.close();
}
}
test1的运行结果截图: