Hibernate--->缓存

2017-08-02  本文已影响0人  守望者00

一、缓存

缓存(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�

上一篇下一篇

猜你喜欢

热点阅读