【Hibernate】二级缓存

2024-08-26 19:38
文章标签 hibernate 二级缓存

本文主要是介绍【Hibernate】二级缓存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    上篇博客简单介绍了hibernate的一级缓存,也就是session级别的缓存,它的生命周期和会话是相同的,不同的会话之间的缓存不能共享。二级缓存也称为进程级的缓存或sessionFactory级的缓存,它可以被所有的会话共享,二级缓存的生命周期和sessionFactory的生命周期一致,sessionFactory可以管理二级缓存。

     hibernate没有提供相应的二级缓存的组件,需要加入额外的二级缓存包,hibernate缓存策略的提供主要是EHCache,OSCache,SwarmCache,JBoss TreeCache。常用的是EHcache


 一,环境配置


引入ehcache的相应jar包

2. 将ehcache.xml中配置文件拷贝到SRC下

在hibernate.cfg.xml文件中加入ehcache的配置

<property name =“hibernate.cache.provider_class”> org.hibernate.cache.EhCacheProvider </ property>  
4. 在hibernate.cfg.xml的文件中启用二级缓存

<propertynamepropertyname =“hibernate.cache.use_second_level_cache”> true </ property>
5.指定哪些实体类型使用二级缓存,可以在映射文件中采用<cache>标签指定或在hibernate.cog.xml文件中指定,下面的代码在hibernate.cfg.xml中进行统一指定。

<class-cacheclassclass-cacheclass =“com.www.hibernate.Student”usage =“read-only”/> 


二,测试类

通过测试类来看二级缓存

public class CacheTest extends TestCase {  / ** *开启二级缓存 *:  *在两个会话中发负载 * /  public void testCache1(){  会话session = null;  尝试{  session = HibernateUtils.getSession();  session.beginTransaction();  学生student(学生)session.load(Student.class,10);  System.out.println(“student.name =”+ student.getName());  session.getTransaction()。commit();  } catch(Exception e){  e.printStackTrace();  session.getTransaction()。rollback();  }最后{  HibernateUtils.closeSession(session);  }}  尝试{  session = HibernateUtils.getSession();  session.beginTransaction();  学生student(学生)session.load(Student.class,10);  //不会发出查询语句,因为配置二级缓存,session可以共享二级缓存中的数据  //二级缓存是进程级的缓存  System.out.println(“student.name =”+ student.getName());  session.getTransaction()。commit();  } catch(Exception e){  e.printStackTrace();  session.getTransaction()。rollback();  }最后{  HibernateUtils.closeSession(session);  }}  }}  / ** *开启二级缓存 *:  *在两个会议中发get * /  public void testCache2(){  会话session = null;  尝试{  session = HibernateUtils.getSession();  session.beginTransaction();  学生student =(Student)session.get(Student.class,10);  System.out.println(“student.name =”+ student.getName());  session.getTransaction()。commit();  } catch(Exception e){  e.printStackTrace();  session.getTransaction()。rollback();  }最后{  HibernateUtils.closeSession(session);  }}  尝试{  session = HibernateUtils.getSession();  session.beginTransaction();  学生student =(Student)session.get(Student.class,10);  //不会发出查询语句,因为配置二级缓存,session可以共享二级缓存中的数据  //二级缓存是进程级的缓存  System.out.println(“student.name =”+ student.getName());  session.getTransaction()。commit();  } catch(Exception e){  e.printStackTrace();  session.getTransaction()。rollback();  }最后{  HibernateUtils.closeSession(session);  }}  }}  / ** *开启二级缓存 *:  *在两个会话中发送负载查询,采用会话中的sessionFactory管理二级缓存 * /  public void testCache3(){  会话session = null;  尝试{  session = HibernateUtils.getSession();  session.beginTransaction();  学生student =(Student)session.load(Student.class,1);  System.out.println(“student.name =”+ student.getName());  session.getTransaction()。commit();  } catch(Exception e){  e.printStackTrace();  session.getTransaction()。rollback();  }最后{  HibernateUtils.closeSession(session);  }}  //管理二级缓存  HibernateUtils.getSessionFactory()。evict(Student.class,1);  尝试{  session = HibernateUtils.getSession();  session.beginTransaction();  学生student =(Student)session.load(Student.class,1);  //管理二级缓存  //HibernateUtils.getSessionFactory().evict(Student.class);  System.out.println(“student.name =”+ student.getName());  session.getTransaction()。commit();  } catch(Exception e){  e.printStackTrace();  session.getTransaction()。rollback();  }最后{  HibernateUtils.closeSession(session);  }}  }}  / ** *开启二级缓存 *:  *一级缓存和二级缓存的交互 * /  public void testCache4(){  会话session = null;  尝试{  session = HibernateUtils.getSession();  session.beginTransaction();  //禁止将一级缓存中的数据放入二级缓存中  session.setCacheMode(CacheMode.IGNORE);  学生student =(Student)session.load(Student.class,1);  System.out.println(“student.name =”+ student.getName());  session.getTransaction()。commit();  } catch(Exception e){  e.printStackTrace();  session.getTransaction()。rollback();  }最后{  HibernateUtils.closeSession(session);  }}  尝试{  session = HibernateUtils.getSession();  session.beginTransaction();  学生student =(Student)session.load(Student.class,1);  //会发出查询语句,因为禁止了一级缓存和二级缓存的交互  System.out.println(“student.name =”+ student.getName());  session.getTransaction()。commit();  } catch(Exception e){  e.printStackTrace();  session.getTransaction()。rollback();  }最后{  HibernateUtils.closeSession(session);  }}  }}  / ** *大批量的数据添加,如清洁了一级缓存,二级缓存也会清出 * /  public void testCache7(){  会话session = null;  尝试{  session = HibernateUtils.getSession();  session.beginTransaction();  //禁止一级缓存和二级缓存交互  session.setCacheMode(CacheMode.IGNORE);  for(int i = 0; i <100; i ++){  学生student =新学生();  student.setName(“张三”+ i);  session.save(student);  if(i%20 == 0){  //执行sql语句,相当于把这些缓存全部保存到数据库中  session.flush();  //清楚缓存的内容  session.clear();  }}  }}  session.getTransaction()。commit();  } catch(Exception e){  e.printStackTrace();  session.getTransaction()。rollback();  }最后{  HibernateUtils.closeSession(session);  }}  }}     
}}  

小结:

   上层的代码还是比较清晰的,不想多做解释,,应该可以理解。二级缓存中适合存在很少被修改的数据;不是很重要的数据,允许出现偶尔并发;不被被并发访问的数据。一级和二级的缓存都是缓存实体对象的,而查询缓存是缓存普通属性结果集的,下一博客介绍查询缓存。

这篇关于【Hibernate】二级缓存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109498

相关文章

java面试常见问题之Hibernate总结

1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象。) Ø  OID检索(按照对象的OID来检索对象。) Ø  HQL检索(使用面向对象的HQL查询语言。) Ø  QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线) Ø  本地SQL检索(使用本地数据库的SQL查询语句。) 包括Hibern

org.hibernate.hql.ast.QuerySyntaxException:is not mapped 异常总结

org.hibernate.hql.ast.QuerySyntaxException: User is not mapped [select u from User u where u.userName=:userName and u.password=:password] 上面的异常的抛出主要有几个方面:1、最容易想到的,就是你的from是实体类而不是表名,这个应该大家都知道,注意

Caused by: org.hibernate.MappingException: Could not determine type for: org.cgh.ssh.pojo.GoodsType,

MappingException:这个主要是类映射上的异常,Could not determine type for: org.cgh.ssh.pojo.GoodsType,这句话表示GoodsType这个类没有被映射到

Hibernate框架中,使用JDBC语法

/*** 调用存储过程* * @param PRONAME* @return*/public CallableStatement citePro(final String PRONAME){Session session = getCurrentSession();CallableStatement pro = session.doReturningWork(new ReturningWork<C

hibernate修改数据库已有的对象【简化操作】

陈科肇 直接上代码: /*** 更新新的数据并并未修改旧的数据* @param oldEntity 数据库存在的实体* @param newEntity 更改后的实体* @throws IllegalAccessException * @throws IllegalArgumentException */public void updateNew(T oldEntity,T newEntity

Hibernate插入数据时,报错:org.springframework.dao.DataIntegrityViolationException: could not insert: [cn.itc

在用junit测试:插入数据时,报一下错误: 错误原因: package junit;import org.junit.Test;import cn.itcast.crm.container.ServiceProvinder;import cn.itcast.crm.dao.ISysUserDao;import cn.itcast.crm.domain.SysRole;

Hibernate中自带的连接池!!!

<span style="font-size:18px; font-family: Arial, Helvetica, sans-serif;"><?xml version="1.0" encoding="UTF-8"?></span> <span style="font-size:18px;"><!DOCTYPE hibernate-configuration PUBLIC"-//Hibern

Java Web:Spring Boot + Mybatis + Redis二级缓存

Spring-Boot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一。Mybatis是一个十分轻量好用的ORM框架。Redis是当今十分主流的分布式key-value型数据库,在web开发中,我们常用它来缓存数据库的查询结果。 本篇博客将介绍如何使用Spring-Boot快速搭建一个Web应用,并且采用Mybatis作为我们的ORM框架。为了提升性能,我们将

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

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

spring mvc+hibernate 实现事务管理(全注解版)

为了方便项目变大配置文件变多,用注解代替 *.hbm.xml,<bean id="*dao" class="">,另外用反省实现dao操作,省去每个类一个dao,此处参考了鸵鸟的例子。 实现功能跟http://blog.csdn.net/waiwai4701/article/details/38270721这个项目是一样的,controller和页面就不再写 首先,jar包支持,为了方便