查询缓存
为数据缓存,不需要缓存一张表中的所有的字段,只需要一部分字段
UpdateTimeStampsCache记录了查询缓存中数据随着时间的变化,hibernate内部就是通过时间戳的方式来检查查询缓存中的数据是否发生变化,发生变化,说明缓存的内容已经和数据库中的不一样了,那么就从缓存中清除已经变化的内容
public class QueryCacheTest extends HibernateUtil{
@Test
public void QueryCacheTest(){
Session session=sessionFactory.openSession();
Query query=session.createQuery("select name from com.sanmao.onemanyutils.Classes");
query.setCacheable(true);//可以访问查询缓存
query.list();
session.close();
session=sessionFactory.openSession();
query=session.createQuery("select name from com.sanmao.onemanyutils.Classes");
query.setCacheable(true);//可以访问查询缓存
query.list();
//第二次讲不会发出sql 语句,因为从查询缓存中直接获取
session.close();
}
/**
* 只要hql 有一丁点儿,不一样那么查询缓存就识别不了
* */
@Test
public void QueryCacheTest2(){
Session session=sessionFactory.openSession();
Query query=session.createQuery("select name from com.sanmao.onemanyutils.Classes");
query.setCacheable(true);//可以访问查询缓存
query.list();
session.close();
session=sessionFactory.openSession();
query=session.createQuery("select name from com.sanmao.onemanyutils.Classes where cid=:cid");
query.setParameter("cid",1L);
query.setCacheable(true);//可以访问查询缓存
query.list();
//因为hql 语句不一样,所以 不会从查询缓存中获取,而是 产生新的SQL语句
session.close();
}
/**
* 先把数据放入到查询缓存中,把查询缓存中的数据进行修改,再次查询
*/
@Test
public void testQueryDataFromQueryCache(){
Session session = sessionFactory.openSession();
Query query = session.createQuery("select name from Classes");
query.setCacheable(true);//可以访问查询缓存
query.list();//classes表中的name字段的数据就被放入到了查询缓存中
session.close();
session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classes classes = (Classes)session.get(Classes.class, 1L);
classes.setName("tyty");
transaction.commit();//把数据修改了,hibernate就会检测到一级缓存中的数据被修改了,
// 说明查询缓存中的数据过时了
//所以查询缓存中的数据就被清空了
session.close();
session = sessionFactory.openSession();
query = session.createQuery("select name from Classes");
query.setCacheable(true);//可以访问查询缓存
query.list();//查询缓存中没有数据了,所以还要发出sql语句
session.close();
}
/**
* 把一个属性放入到二级缓存中
*/
@Test
public void testSecondCache(){
Session session = sessionFactory.openSession();
Query query = session.createQuery("select name from Classes");
query.list();//query.list方法产生的结构不符合二级缓存中的要求
System.out.println(sessionFactory.getStatistics().getEntityLoadCount());
session.close();
}
}