热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

hibernate查询缓存详细分析

这篇文章主要介绍了hibernate查询缓存详细分析,包括查询缓存配置方法及关闭二级缓存的详细介绍,需要的朋友参考下本文吧

 一、查询缓存配置

1、在hibernate.cfg.xml中加入查询缓存的策略,  true      启用查询缓存的策略,默认是false。 

二、关闭二级缓存,采用query.list()查询普通属性

代码如下所示。

public voidtestCache1() { 
  Session session = null; 
  try { 
   session= HibernateUtils.getSession(); 
   session.beginTransaction(); 
   Listnames = session.createQuery("select s.name from Student s") 
       .setCacheable(true) 
       .list(); 
   for (int i=0;i

我们可以看到控制台输出语句,仅输出一次:Hibernate: select student0_.name as col_0_0_ fromt_student student0_ 

由此可知,我们开启了查询缓存,第一次进行查询的时候,已经把结果放到querycache中,当第二次再次做出相同的查询的时候,就不再向数据库发重复的sql语句了。

三、关闭二级缓存,启用查询缓存,采用query.list()查询普通属性

代码就如下所示。

public voidtestCache2() { 
  SessiOnsession= null; 
  try { 
   session= HibernateUtils.getSession(); 
   session.beginTransaction(); 
   Listnames = session.createQuery("select s.name from Student s") 
       .setCacheable(true) 
       .list(); 
   for (int i=0;i

运行结果如下所示。

控制台打印结果:

select student0_.name as col_0_0_ fromt_student student0_
班级0的学生0
班级0的学生1
班级0的学生2
班级0的学生3
班级0的学生4
班级0的学生5…

我们可以看出,同样,只打印一次查询语句,如果没有开启查询缓存的话,并且关闭二级缓存的情况下,还会去数据库再查询一遍,而我们的程序中没有再去重复的去数据库中查询的原因是,当开启query缓存的时候,查询缓存的生命周期与session无关。

四、关闭二级缓存,开启查询,采用query.iterate()查询普通属性

代码如下所示。

public voidtestCache3() { 
  SessiOnsession= null; 
  try { 
   session= HibernateUtils.getSession(); 
   session.beginTransaction(); 
   Iteratoriter = session.createQuery("select s.name from Student s") 
       .setCacheable(true) 
       .iterate(); 
   while(iter.hasNext()){ 
   Stringname = (String)iter.next(); 
   System.out.println(name); 
   } 
   session.getTransaction().commit(); 
  }catch(Exceptione) { 
   e.printStackTrace(); 
   session.getTransaction().rollback(); 
  }finally { 
   HibernateUtils.closeSession(session); 
  } 
  System.out.println("-------------------------------------------------------"); 
  try { 
   session= HibernateUtils.getSession(); 
   session.beginTransaction(); 
   //会发出查询语句,query.iterate()查询普通属性它不会使用查询缓存 
   //查询缓存只对query.list()起作用 
   Iteratoriter = session.createQuery("select s.name from Student s") 
      .setCacheable(true) 
      .iterate(); 
   while(iter.hasNext()){ 
   Stringname = (String)iter.next(); 
   System.out.println(name); 
   } 
   session.getTransaction().commit(); 
  }catch(Exceptione) { 
   e.printStackTrace(); 
   session.getTransaction().rollback(); 
  }finally { 
   HibernateUtils.closeSession(session); 
  } 
  
 } 

显控制台显示结果打印了两次sql语句。

-------------------------------------------------------

Hibernate: select student0_.name as col_0_0_from t_student student0_

根据这样的结果我们发现,quer.iterate()查询普通属性它是不会使用查询缓存,查询缓存只对query.list()起作用。

五、关闭二级缓存,关闭查询缓存,采用query.list()查询实体

代码如下所示。

public voidtestCache4() { 
  SessiOnsession= null; 
  try { 
   session= HibernateUtils.getSession(); 
   session.beginTransaction(); 
   List students =session.createQuery("select s from Student s") 
       .list(); 
   for (int i=0;i

   显示结果如下所示。

控制台上打印两次sql语句。

Hibernate:select student0_.id as id0_, student0_.name as name0_, student0_.classesid asclassesid0_ from t_student student0_

班级0的学生0
班级0的学生1
班级0的学生2
班级0的学生3
班级0的学生4

由此可知,不开启查询缓存,默认query.list每次执行都会发出查询语句。

六、关闭二级缓存,开启查询缓存,采用query.list()查询实体

代码如下所示。

Session session = null; 
  try { 
   session= HibernateUtils.getSession(); 
   session.beginTransaction(); 
   Liststudents = session.createQuery("select s from Student s") 
       .setCacheable(true) 
       .list(); 
   for (int i=0;i

控制台打印sql如下图所示。

在第一次查询的时候,发出一条sql语句查询出结果,因为我们开启了查询缓存,会把第一次查询出的实体结果集的id放到查询缓存中,第二次再次执行query.list()的时候,会把id拿出来,到相应的缓存去找,因为是跨session,在二级缓存中找不到,所以每次都会发出查询语句,二级缓存中不存在,有多少个id就会发出查询语句多少次。 

七、开启二级缓存,开启查询缓存,采用query.list()查询实体

代码如下所示。

/** 
 * 开启查询,开启二级缓存,采用query.list()查询实体 
 * 
 * 在两个session中发query.list()查询 
 */ 
 public voidtestCache6() { 
  SessiOnsession= null; 
  try { 
   session= HibernateUtils.getSession(); 
   session.beginTransaction(); 
   Liststudents = session.createQuery("select s from Student s") 
       .setCacheable(true) 
       .list(); 
   for (int i=0;i

结果如下所示

Hibernate: select student0_.id as id0_,student0_.name as name0_, student0_.classesid as classesid0_ from t_studentstudent0_

只发出一次sql请求,当我们第一次执行query.list()会放到二级缓存中,和query缓存中。当我们第一次执行查询时,会找到相应的id到缓存中查找,在二级缓存中存在,则直接从二级缓存中取出数据,不再向数据库中发出sql语句。

八、查询缓存总结

查询缓存是缓存普通属性结果集的,对实体对象的结果集会缓存id。查询缓存的生命周期,当关联的表发生修改时,查询缓存的生命周期结束。

而开启缓存的时候,我们就要去维护缓存,如果缓存和内存中的数据不一致的话,和数据不同步,可能给用户显示的是脏数据了。所以根据需要使用缓存机制。

总结

以上所述是小编给大家介绍的hibernate查询缓存详细分析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


推荐阅读
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 本文探讨了SSDP(简单服务发现协议)和WSD(Web服务发现)协议,特别是SSDP如何通过固定多播地址239.255.255.250:1900实现局域网内的服务自发现功能。文中还详细介绍了SSDP协议的关键操作类型及其应用场景。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • PHP 中 preg_match 函数的 isU 修饰符详解
    本文详细解析 PHP 中 preg_match 函数中 isU 修饰符的具体含义及其应用场景,帮助开发者更好地理解和使用正则表达式。 ... [详细]
  • 深入分析十大PHP开发框架
    随着PHP技术的发展,各类开发框架层出不穷,成为了开发者们热议的话题。本文将详细介绍并对比十款主流的PHP开发框架,旨在帮助开发者根据自身需求选择最合适的工具。 ... [详细]
  • MySQL 'Too Many Connections' 错误处理及优化方案
    本文详细介绍了如何诊断和解决MySQL数据库中出现的‘Too Many Connections’错误,包括查看当前连接状态、调整配置文件以及优化应用代码等方法。 ... [详细]
  • 本文详细介绍了MySQL中的存储过程,包括其定义、优势与劣势,并提供了创建、调用及删除存储过程的具体示例,旨在帮助开发者更好地利用这一数据库特性。 ... [详细]
  • 最新计算机专业原创毕业设计参考选题都有源码+数据库是近期作品ling取参考你的选题刚好在下面有,有时间看到机会给您发1ssm资源循环利用2springboot校园考勤系统3ssm防 ... [详细]
  • 请看|间隔时间_Postgresql 主从复制 ... [详细]
  • 本文详细探讨了在服务器上运行的PostgreSQL数据库出现'内存不足'错误的具体情况,并提供了一系列有效的解决策略。通过本文,读者将能够更好地理解这一常见问题及其背后的原理。 ... [详细]
  • 本文详细介绍了如何使用Python中的xlwt库将数据库中的数据导出至Excel文件,适合初学者和中级开发者参考。 ... [详细]
  • 探讨在使用Rails框架创建数据库记录时,created_at字段未能正确反映系统当前时间的原因及解决方法。 ... [详细]
  • 本文详细介绍了在Linux环境下如何有效地管理任务,包括撤销操作、挂起与恢复任务、终止后台程序以及取消定时任务的方法。这些技巧对于提高日常工作效率和系统维护至关重要。 ... [详细]
  • 在使用Maven构建多模块项目时,执行`nvm clean install`命令可能会遇到子模块路径配置错误的问题,导致提示‘pom.xml does not exist’的错误信息。 ... [详细]
  • 本文介绍了一种在Win10 UWP应用中实现根据数值动态改变颜色的控件的方法。通过将椭圆的颜色与整数绑定,并利用值转换器来实现颜色的渐变效果。 ... [详细]
author-avatar
海伦国际官2502862377
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有