Hibernate总结(七)--之数据缓存

来源:互联网 发布:咸宁软件开发 编辑:程序博客网 时间:2024/04/30 00:22

转载:http://blog.csdn.net/wjw0130/article/details/47615465

结合博主,自己测试代码


一级缓存解决在一次查询中,只与数据库交互一次

二级缓存解决一些常用的、公开的数据存放起来,方便使用,那查询缓存呢?


一、查询缓存的原理

一级缓存和二级缓存都是对象的缓存。对象缓存就是把该对象对应的数据库表中的所有的字段全部查询出来,而这种查询通常会让小效率降低,比如,表中字段很多,但程序中只需要几个字段,而这样的情况,使用一级缓存或二级缓存会让效率降低。

查询缓存也叫数据缓存,也就是说内存中需要多少数据,就把多少数据放入到查询缓存,这样就大大提高了查询效率。所以查询缓存解决了一张表中部分字段查询的问题。

1.1 生命周期

只要数据放入到查询缓存中,该缓存会一直存在,直到缓存中的数据被修改了,该缓存的生命周期结束.


两者构成了查询缓存。

1.2 操作


1.3 思考:

Hibernate是如判断查询缓存中的值与数据库中的值是否一样呢?

一样就保存,不一样就干掉。实际上 Hibernate 利用的时间戳缓存来判断数据的有效性,时间戳中记录了查询缓存从创建到清除的变化日志,Hibernate 利用该日志来判断缓存中的数据是否更新

一级缓存解决在一次查询中,只与数据库交互一次

二级缓存解决一些常用的、公开的数据存放起来,方便使用,那查询缓存呢?


一、查询缓存的原理

一级缓存和二级缓存都是对象的缓存。对象缓存就是把该对象对应的数据库表中的所有的字段全部查询出来,而这种查询通常会让小效率降低,比如,表中字段很多,但程序中只需要几个字段,而这样的情况,使用一级缓存或二级缓存会让效率降低。

查询缓存也叫数据缓存,也就是说内存中需要多少数据,就把多少数据放入到查询缓存,这样就大大提高了查询效率。所以查询缓存解决了一张表中部分字段查询的问题。

1.1 生命周期

只要数据放入到查询缓存中,该缓存会一直存在,直到缓存中的数据被修改了,该缓存的生命周期结束.


两者构成了查询缓存。

1.2 操作


1.3 思考:

Hibernate是如判断查询缓存中的值与数据库中的值是否一样呢?

一样就保存,不一样就干掉。实际上 Hibernate 利用的时间戳缓存来判断数据的有效性,时间戳中记录了查询缓存从创建到清除的变化日志,Hibernate 利用该日志来判断缓存中的数据是否更新


<span style="font-family:KaiTi_GB2312;">//配置二级缓存和数据缓存</span><!-- 二级缓存的供应商--><property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property><!-- 开启二级缓存--><property name="cache.use_second_level_cache">true</property><!-- <class-cache usage="read-only" class=""/>--><!--         开启二级缓存的统计机制    -->    <property name="generate_statistics">true</property>    <!--         开启了查询缓存     -->    <property name="cache.use_query_cache">true</property>
<span style="font-family:KaiTi_GB2312;">//测试代码</span>/** * "from Classes"查询出来的数据能够放入到查询缓存中 */@Testpublic void testList_1(){Session session = sessionFactory.openSession();Query query = session.createQuery("from Classes");query.setCacheable(true);//query要使用查询缓存了query.list();//把数据放入到查询缓存中session.close();session = sessionFactory.openSession();query = session.createQuery("from Classes");query.setCacheable(true);query.list();session.close();}/** * "select name from Classes" * 查询出来的数据能够放入到查询缓存中 *      但是不能放入到二级缓存中,因为不是对象 */@Testpublic void testList_2(){Session session = sessionFactory.openSession();Query query = session.createQuery("select name from Classes");query.setCacheable(true);//query要使用查询缓存了query.list();//把数据放入到查询缓存中System.out.println(sessionFactory.getStatistics().getEntityLoadCount());session.close();session = sessionFactory.openSession();query = session.createQuery("select name from Classes");query.setCacheable(true);query.list();session.close();}/** * 如果两个hql一样,则可以利用查询缓存,如果不一样,哪怕有一点不一样,就不能够利用了。 */@Testpublic void testList_3(){Session session = sessionFactory.openSession();Query query = session.createQuery("select name from Classes");query.setCacheable(true);//query要使用查询缓存了query.list();//把数据放入到查询缓存中session.close();session = sessionFactory.openSession();query = session.createQuery("select name from Classes where cid=1");query.setCacheable(true);query.list();session.close();}/** * 先把一些数据放入到查询缓存中,修改一些数据,看生命周期 */@Testpublic void testList_4(){/** * 把name放入到了查询缓存中 */Session session = sessionFactory.openSession();Query query = session.createQuery("select name from Classes");query.setCacheable(true);//query要使用查询缓存了query.list();//把数据放入到查询缓存中session.close();/** * 修改name属性的值 *   修改了查询缓存的时间戳缓存,从而知道了该数据已经被修改了,查询缓存中的数据就被清空了 */session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();Classes classes = (Classes)session.get(Classes.class, 1L);classes.setName("adsfasfd");transaction.commit();session.close();/** * 再次查询name属性的值,查询缓存中name属性的值清空了 */session = sessionFactory.openSession();query = session.createQuery("select name from Classes");query.setCacheable(true);//query要使用查询缓存了query.list();//把数据放入到查询缓存中session.close();}






0 0