1、为什么要用缓存?
![](https://img-blog.csdn.net/20151104112030076?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
Hibernate是一个持久层框架,经常访问物理数据库。为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。
2、缓存原理?
Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存。
1)
Hibernate一级缓存又称为“Session的缓存”。Session内置不能被卸载,Session的缓存是事务范围的缓存。一级缓存是缓存实体对象的
2)
Hibernate二级缓存又称为“SessionFactory的缓存”或者进程级的缓存。二级缓存可以被所有的session共享,二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存,但有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。二级缓存主要是缓存实体对象的
3)
什么样的数据适合存放到第二级缓存中?
1) 很少被修改的数据2) 不是很重要的数据,允许出现偶尔并发的数据3) 不会被并发访问的数据4) 常量数据
4)不适合存放到第二级缓存的数据?
1) 经常被修改的数据2) 绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发3) 与其他应用共享的数据。
3、缓存的应用
1)一级缓存
/**
* 在同一个session中,发出两次load查询
*/
public void testLoad1(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
Student student=(Student)session.load(Student.class, 1);
System.out.println(student.getName());
//不会发出查询语句,load使用缓存
student=(Student)session.load(Student.class, 1);
System.out.println(student.getName());
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
2)二级缓存的配置
1) 将ehcache.xml文件拷贝到 src 下
2)在hibernate.cfg.xml文件中加入缓存产品提供商< property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>3)启用二级缓存,这也是它的默认配置< property name="hibernate.cache.use_second_level_cache">true</property>4)指定哪些实体类使用二级缓存可以在映射文件中采用<cache>标签中指定或在hibernate.cfg.xml文件中统一指定注意使用的策略,通常使用read-only和read-write<!-- 配置使用二级缓存的类 --><class-cache usage="read-only" class="com.tgb.hibernate.Student"/>5)缓存原则:通常读远远大于写的数据进行缓存6) 注意大批量数据更新时,如果配置了二级缓存,建议禁用一级缓存和二级缓存的交互
try{ session=HibernateUtils.getSession(); session.beginTransaction(); //从二级缓存中清除id为1的Student对象 sessionFactory.evict(Student.class, new Integer(1)); //禁止将一级缓存中的数据放到二级缓存中 session.setCacheMode(CacheMode.IGNORE); Student student=(Student)session.load(Student.class, 1); System.out.println(student.getName()); //不会发出查询语句,因为配置了二级缓存,session可以共享二级缓存中的数据 //二级缓存是进程级的缓存 student=(Student)session.load(Student.class, 1); System.out.println(student.getName()); session.getTransaction().commit(); }catch(Exception e){ e.printStackTrace(); session.getTransaction().rollback(); }finally{ HibernateUtils.closeSession(session); }
总结:虽然缓存帮我们提高了性能问题,但是却增加了维护的工作量,比如说我要进行增删改操作的时候,还需要同时更新缓存,以保证数据的正确性。所以说在方面某一方面的时候必定会降低其他方面,没有好与不好,合理利用就行。