数据特点
1、公共的数据
2、不经常修改的数据
3、私密性不是很高的数据
结构
二级缓存的生命周期
当hibernate程序开始的时候,二级缓存就存在了,当hibernate容器销毁的时候,
二级缓存就销毁了。
hibernate内部没有提供二级缓存的实现
默认情况下,利用的是ehcache。
步骤在配置文件中
步骤1
在hibernate的配置文件中开启二级缓存
步骤2
在hibernate的配置文件中提供二级缓存的供应商
步骤3
开启类级别的二级缓存
<!--
开启二级缓存
-->
<property name="cache.use_second_level_cache">true</property>
<!--
二级缓存的供应商
-->
<property name="cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
<!--
开启了类级别的二级缓存
usage 二级缓存的缓存策略
read-only
可以把一个对象放入到二级缓存中,但是不能修改
read-write
可以把一个对象放入到二级缓存中,可以读可以改
class 类的全名
-->
<class-cache usage="read-only" class="com.hw.entity.Classes"/>
第二种方案 在映射文件Classes.hbm.xml文件中
类级别的操作
/**
* session.get方法把对象放入到了二级缓存中
* 先从一级缓存中查找数据,再从二级缓存中查找数据,最后从数据库中查询数据
* 把查找出来的数据放入到一级和二级缓存中
*/
@Test
public void testGet(){
Session session = sessionFactory.openSession();
Classes classes = (Classes)session.get(Classes.class, 1L);
System.out.println(sessionFactory.getStatistics().getEntityLoadCount());
session.close();//一级缓存的数据没有了
session = sessionFactory.openSession();
classes = (Classes)session.get(Classes.class, 1L);
session.close();
}
/**
* save方法
* save方法不能把对象放入到二级缓存中
*/
@Test
public void testSave(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classes classes = new Classes();
classes.setName("aaa");
session.save(classes);
System.out.println(sessionFactory.getStatistics().getEntityLoadCount());
transaction.commit();
session.close();
session = sessionFactory.openSession();
Classes classes2 = (Classes)session.get(Classes.class, classes.getCid());
session.close();
}
/**
* session.update方法也不能把对象放入到二级缓存中
*/
@Test
public void testUpdate(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classes classes = new Classes();
classes.setCid(1L);
classes.setName("aaa");
session.update(classes);
System.out.println(sessionFactory.getStatistics().getEntityLoadCount());
transaction.commit();
session.close();
}
/**
* list方法
* list方法可以把对象放入到二级缓存中
*/
@Test
public void testList(){
Session session = sessionFactory.openSession();
session.createQuery("from Classes").list();
System.out.println(sessionFactory.getStatistics().getEntityLoadCount());//输出有值
session.close();
}
二级缓存的统计机制
<property name="generate_statistics">true</property>