hibernate中的二级缓存

二级缓存使用场景:不经常修改的数据,但是经常的访问的数据会放到缓存中去

一级缓存仅仅是session内部的缓存,用来存取sql语句,比如说连续调用两次相同参数的get方法,就是session缓存

二级缓存是sessiionFactory层面的缓存,即不同线程,不同程序之间的缓存

1.在hibernate.hbm.xml中加载配置

<property name="cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>

<!-- 配置缓存项 可以在hibernate.hbm.xml下配置 也可以在各自类下的映射文件下配 -->
<class-cache usage="read-write" class="cache.Employee"/>
<class-cache usage="read-write" class="cache.Department"/>

类缓存

public void testCahce()
{
Session session=sessionFactory.openSession();

Transaction tx=session.beginTransaction();
Employee employee=(Employee) session.get(Employee.class, 1);
// System.out.println(employee);

Session session2=sessionFactory.openSession();
Employee employee1=(Employee) session.get(Employee.class,1);

//sessionFactory 二级缓存 当两个session用get查询相同的数据就会调用使用

tx.commit();
session.close();
}

2.集合缓存

<collection-cache usage="read-write" collection="cache.Department.employees"/>

/**
* 二级缓存中的集合缓存
*/
@Test
public void testCahce2()
{
Session session=sessionFactory.openSession();

Transaction tx=session.beginTransaction();
Department department=(Department) session.get(Department.class, 1);
System.out.println(department.getEmployees());//懒加载
// System.out.println(employee);
Session session2=sessionFactory.openSession();
department=(Department) session2.get(Department.class, 1);
System.out.println(department.getEmployees()); //由于集合为设置二级缓存 所以相同数据也会加载两次
//sessionFactory 二级缓存 当两个session用get查询相同的数据就会调用使用

tx.commit();
session.close();

不是用集合缓存

}

使用集合缓存

3.查询语句缓存(只针对相同sql语句的缓存)

(1)iterator实现

/**
* 查询缓存 n+1次查询 按一模一样的查询语句来缓存
*/
@Test
public void testQueryCache()
{
Session session=sessionFactory.openSession();

Transaction tx=session.beginTransaction();
Iterator<Employee> iterator=session.createQuery("from Employee where id<5").iterate();
while(iterator.hasNext())
{
System.out.println(iterator.next());
}

Iterator<Employee> iterator1=session.createQuery("from Employee where id<5").iterate();
while(iterator1.hasNext())
{
System.out.println(iterator1.next());
}
tx.commit();
session.close();
}

(2)使用setCacheable实现

需加载额外配置

<property name="cache.use_query_cache">true</property>

@Test
public void testQueryCachetrue()
{
Session session=sessionFactory.openSession();

Transaction tx=session.beginTransaction();
List list=session.createQuery("from Employee where id<5").setCacheable(true).list();
System.out.println(list);
tx.commit();
session.close();
Session session1=sessionFactory.openSession();
Transaction tx1=session1.beginTransaction();
List list1=session1.createQuery("from Employee where id<5").setCacheable(true).list();
System.out.println(list1);
tx1.commit();
session1.close();

}

但是sql语句有一点不一样 ,都不能使用缓存

时间: 2024-10-14 09:08:37

hibernate中的二级缓存的相关文章

具体解释Hibernate中的二级缓存

1.前言 这篇博客再前几篇博客的基础上来解说一下.Hibernate中的二级缓存.二级缓存是属于SessionFactory级别的缓存机制. 第一级别的缓存是Session级别的缓存,是属于事务范围的缓存,由Hibernate管理,一般无需进行干预.第二级别的缓存是SessionFactory级别的缓存.是属于进程范围的缓存. 2.Hibernate二级缓存 1.分类 二级缓存也分为了两种 内置缓存:Hibernate自带的,不可卸载,通常在Hibernate的初始化阶段,Hibernate会把

详解Hibernate中的二级缓存

1.前言 这篇博客再前几篇博客的基础上来讲解一下,Hibernate中的二级缓存,二级缓存是属于SessionFactory级别的缓存机制.第一级别的缓存是Session级别的缓存,是属于事务范围的缓存,由Hibernate管理,一般无需进行干预.第二级别的缓存是SessionFactory级别的缓存,是属于进程范围的缓存. 2.Hibernate二级缓存 1.分类 二级缓存也分为了两种 内置缓存:Hibernate自带的,不可卸载,通常在Hibernate的初始化阶段,Hibernate会把映

Hibernate中延迟加载和缓存

什么是延迟加载? 延迟加载是指当应用程序想要从数据库获取对象时(在没有设置lazy属性值为false),Hibernate只是从数据库获取符合条件的对象的OId从而生成代理对象,并没有加载出对象 访问该对象的属性时才会加载出相应的值.简答来说就是尽可能的减少查询的数据量. 如何配置延迟加载 在Hibernate中通过.hbm配置文件中的lazy属性来陪值,并且lazy属性出现的位置不同其作用和取值也不同.下面来详细介绍其在不同位置的不同取值和作用 类Class标签中的lazy: 在类标签Clas

Hibernate中的一级缓存、二级缓存和懒加载

1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中一级缓存,也叫做session的缓存,当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中. 一级缓存可以在session范围内减少数据库的访问次数,只在session范围有效,session关闭,一级

Hibernate中的一级缓存、二级缓存和懒加载(转)

1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中一级缓存,也叫做session的缓存,当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中. 一级缓存可以在session范围内减少数据库的访问次数,只在session范围有效,session关闭,一级

hibernate一级和二级缓存介绍

一级缓存Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存Hibernate一级缓存又称为"Session的缓存",它是内置的,不能被卸载(不能被卸载的意思就是这种缓存不具有可选性,必须有的功能,不可以取消session缓在第一级缓存中,持久化类的每个实例都具有唯一的OID存 .在缓存中的对象,具有持久性,session对象负责管理.一级缓存的优点是使用同一个session对象多次查询同一个数据对象,仅对数据库查询一次例如:session.load

【MyBatis学习13】MyBatis中的二级缓存

1. 二级缓存的原理 前面介绍了,mybatis中的二级缓存是mapper级别的缓存,值得注意的是,不同的mapper都有一个二级缓存,也就是说,不同的mapper之间的二级缓存是互不影响的.为了更加清楚的描述二级缓存,先来看一个示意图: 从图中可以看出: sqlSession1去查询用户id为1的用户信息,查询到用户信息会将查询数据存储到该UserMapper的二级缓存中. 如果SqlSession3去执行相同 mapper下sql,执行commit提交,则会清空该UserMapper下二级缓

Hibernate的一级二级缓存机制配置与测试

特别感谢http://www.cnblogs.com/xiaoluo501395377/p/3377604.html 在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论下我们的N+1的问题. 随笔虽长,但我相信看完的朋友绝对能对hibernate的 N+1问题以及缓存有更深的了解. 一.N+1问题 首先我们来探讨一下N+1的问题,我们先通过一个例子来看一下,什么是N+1问题: list(

在Spring、Hibernate中使用Ehcache缓存(2)

这里将介绍在Hibernate中使用查询缓存.一级缓存.二级缓存,整合Spring在HibernateTemplate中使用查询缓存.,这里是hibernate3,使用hibernate4类似,不过不用hibernatetemplate,直接        Query query = getSession().createQuery(hql);        //开启二级缓存        query.setCacheable(true); EhCache是Hibernate的二级缓存技术之一,