使用的前提条件:
1:固定不变的数据;
2:隔指定时间才去变动的数据;
3:一般情况下在查询的时候才使用
4:不会被并发访问的数据
- 一级缓存
Sessioon级别的缓存,非线程安全,每次使用完毕必须关闭。
如果session关闭,一级缓存失效。
默认一级缓存是开启的;
Sql 在同一个session中,如果第二次执行的sql语句跟第一次执行的sql语句一致,不在去数据库重复查询;
@Test
public void queryEmployee(){
Session session = SessionUtils.getSession();
Transaction trans = session.beginTransaction();
trans.begin();
System.out.println("第一次查询");
session.createCriteria(Employee.class).list();
System.out.println("第二次查询");
session.load(Employee.class, 8);
session.get(Employee.class, 7);
trans.commit();
session.close();
Session session1 = SessionUtils.getSession();
Transaction trans1 = session1.beginTransaction();
trans1.begin();
System.out.println("第三次查询");
session1.get(Employee.class, 6);
trans1.commit();
session1.close();
}
- 二级缓存
A:基于sessionFactory的缓存。所有的session都共享;
B:有插件去支持hibernate的二级缓存
◆EhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。
◆OSCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持。
◆SwarmCache:可作为群集范围内的缓存,但不支持Hibernate的查询缓存。
◆JBossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对Hibernate的查询缓存提供了支持。
步骤:
1.导包
.Hibernate的包;
.hibernate-distribution-3.6.0.Final\lib\optional\ehcache下面的包
依赖jar包:
.commons-logging.jar
.backport-util-concurrent.jar
2.核心配置文件 hibernate.cfg.xml
二级缓存相关属性:
hibernate.cache.provider_class:该属性设置二级缓存CacheProvider类名
hibernate.cache.use_minimal_puts:以频繁的读操作为代价,优化二级缓存以实现最小化写的操作。
hibernate.cache.use_query_cache:设置是否允许查询缓存。
hibernate.cache.use_second_level_cache:设置是否启用二级缓存;
hibernate.cache.query_cache_factory:设置查询缓存工厂的类名;
hibernate.cache.region_prefix:设置二级缓存区的名称的前缀
hibernate.cache.use_structured_entries:用于设置是否强制hunernate以更好的格式讲缓存存入二级缓存;<!-- 配置二级缓存start -->
<!-- 配置是否启用二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- 使用hibernate缓存的插件类,告诉hibernate框架,使用的插件类是哪一个-->
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<!-- 配置二级缓存end -->- 在hibernate.cfg.xml文件里配置
- 在映射文件中配置缓存(哪里使用缓存)
缓存策略:
Read-only:只读,这个是最简单也是最常用的一种加载策略;
Read/wirte:读写,可以读可以写;
天气预报:
每天的7:59 11:59 16:59 通过spring 定时调度去查询天气预报的数据,并且放到缓存。
<?xml version="1.0" encoding="UTF-8"?>
<eache>
<diskStore path="d:/log/cache"></diskStore>
<defaultCache
maxElementsInMemory="500"
eternal="false"
timeToLiveSeconds="7200"
timeToIdleSeconds="3600"
overflowToDisk="true" />
<!--
name:
maxElementsInMemory:设置缓存中可以放置多少个对象
timeToIdleSeconds:设置对象在过去之前可以存活多少秒
eternal:设置缓存是否永久有效
overflowToDisk:设置缓存中的记录达到maxElementsInMemory就会被持久化到硬盘中,路径为diskStore
-->