Hibernate--->缓存
一、缓存
缓存(Cache):计算机领域非常通用的概念。他介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写硬盘(永久性数据存储源)的频率,从而提高应用的运行性能。缓存中的数据存储源中数据的拷贝。缓存的物理介质通常是内存
二、二级缓存
1.hibernate提供缓存机制:一级缓存、二级缓存
a)一级缓存:session级别缓存,在一次请求中共享数据。
b)二级缓存:sessionFactory级别缓存,整个应用程序共享一个会话工厂,共享一个二级缓存。
2.SessionFactory的缓存两部分:
a)内置缓存:使用一个Map,用于存放配置信息,预定义SQL语句等,提供给Hibernate框架自己使用,对外只读的。不能操作。
b)外置缓存:使用另一个Map,用于存放用户自定义数据。默认不开启。外置缓存hibernate只提供规范(接口),需要第三方实现类。外置缓存有成为二级缓存。
三、缓存的应用场景
1.适合放入二级缓存中的数据:
a)很少被修改
b)经常被访问
c)不是很重要的数据,允许出现偶尔的并发问题
2.不适合放入二级缓存中的数据:
a)经常被修改
财务数据,绝对不允许出现并发问题
四、二级缓存的供应商
1.EHCache:可作为进程(单机)范围内的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。
2.OpenSymphony `:可作为进程范围内的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持
3.SwarmCache:可作为集群范围内的缓存,但不支持Hibernate的查询缓存
4.JBossCache:可作为集群范围内的缓存,支持Hibernate的查询缓存
五、如何使用ehcache
1.导入jar包:ehcache-1.5.0.jar/ commons-logging.jar/ backport-util-concurrent.jar
2.开启二级缓存
3.确定二级缓存提供商
4.确定需要缓存内容
1>配置需要缓存的类
2>配置需要缓存的集合
5.配置ehcache自定义配置文件
更名为ehcache.xml,放到src目录下
一切准备就绪,案例演示二级缓存的特点
@Test
/**
*查询单个对象
*/
publicvoidtestCache(){
SessionFactoryfactory= HibernateUtils.getSessionFactory();
Sessionsession=factory.getCurrentSession();
session.beginTransaction();
//
Personp1= (Person)session.get(Person.class, 23);
Personp2= (Person)session.get(Person.class, 23);
//
session.getTransaction().commit();
//开启一个新的session
Sessionsession2=factory.getCurrentSession();
System.out.println(session==session2);
session2.beginTransaction();
//如果二级缓存生效,此处将不会发送SQL语句
Personp3= (Person)session2.get(Person.class, 23);
session2.getTransaction().commit();
factory.close();
}
@Test
/**
*查询集合
*/
publicvoidtestCache2(){
SessionFactoryfactory= HibernateUtils.getSessionFactory();
Sessionsession=factory.getCurrentSession();
session.beginTransaction();
//
Personp1= (Person)session.get(Person.class, 23);
Setphones=p1.getPhones();
for(Phonephone:phones){
System.out.println(phone);
}
//
session.getTransaction().commit();
//开启一个新的session
Sessionsession2=factory.getCurrentSession();
System.out.println(session==session2);
session2.beginTransaction();
//如果二级缓存生效,此处将不会发送SQL语句
Personp3= (Person)session2.get(Person.class, 23);
Setphones2=p3.getPhones();
for(Phonephone:phones2){
System.out.println(phone);
}
session2.getTransaction().commit();
factory.close();
}
配置文件详解
maxElementsInMemory=“10000”
//Cache中最多允许保存的数据对象的数量
external=“false” //缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期
timeToIdleSeconds=“1000” //缓存数据钝化时间(设置对象在它过期之前的空闲时间,单位为秒)
timeToLiveSeconds=“1000” //缓存数据的生存时间(设置对象在它过期之前的生存时间)
overflowToDisk=“false”
/> //内存不足时,是否启用磁盘缓存
memoryStoreEvictionPolicy="LRU"
//内存不足时数据对象的清除策略
ehcache中缓存的3种清空策略:
FIFO(first in first out):先进先出
LFU( Less
Frequently Used):一直以来最少被使用的。如上面所讲,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。
LRU(Least Recently Used):最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
查询缓存
1.查询缓存又称为三级缓存
2.查询缓存默认不使用。需要手动开启
3.查询缓存:将HQL语句与查询结果进行绑定。通过HQL相同语句可以缓存内容。
a)默认情况Query对象只将查询结果存放在一级和二级缓存,不从一级或二级缓存获取。
b)查询缓存就是让Query可以从二级缓存获得内容。
使用步骤
1.开启二级缓存
2.在查询query对象,设置缓存内容(注意:存放和查询都需要设置)
true
@Test
/**
*查询集合
*/
publicvoidtestQueryCache(){
SessionFactoryfactory= HibernateUtils.getSessionFactory();
Sessionsession=factory.getCurrentSession();
session.beginTransaction();
//
Queryquery=session.createQuery("from Person");
//设置使用查询缓存
query.setCacheable(true);
query.list();
//
session.getTransaction().commit();
//开启一个新的session
Sessionsession2=factory.getCurrentSession();
session2.beginTransaction();
Queryquery2=session2.createQuery("from Person");
query2.setCacheable(true);
query2.list();
session2.getTransaction().commit();
factory.close();
}
0.cn�E�,Vo�