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

详解Hibernate缓存与性能优化

在hibernate中,提到性能优化,很自然地我们就想到了缓存。缓存是什么,都有哪些呢?下面这篇文章就主要给大家介绍了关于Hibernate缓存与性能优化的相关资料,需要的朋友可以参考下。

缓存概念

缓存 介于应用程序和永久性数据源(文件,数据库等)之间,作用就是降低应用程序直接读取数据源的频率,从而提高应用程序的运行性能。缓存中的数据就是数据源中数据的复制,应用程序在运行时直接读取缓存中的数据。

缓存的物理介质通常是内存,而永久性数据存储源的物理介质通常是硬盘或磁盘,应用程序读写内存的速度显然比读写硬盘的速度快。如果缓存存放的数据非常大,也会用硬盘作为缓存的物理介质。

Hibernate缓存分类

在hibernate中提供了二种缓存机制:一级缓存、二级缓存,因为二级缓存策略是针对于ID查询的缓存策略,对于条件查询则毫无作用,为此,Hibernate提供了针对条件查询的Query Cache(查询缓存)

1、一级缓存。session缓存就是一级缓存。由于session对象的生命周期通常对应一个数据库事物,因此他的缓存范围是事物范围的缓存。一级缓存是必需的,在一级缓存中,持久化类的每个实例都具有唯一的OID;

2、二级缓存。sessionFactory分为内置缓存和外置缓存。

     内置缓存是hibernate自带的,不可拆卸,是只读缓存,用来存放映射元数据和预定义SQL语句。

     外置缓存是一个可配置的缓存插件,默认sessionFactory不会启用这个缓存插件,外置缓存中的数据就是数据库数据的复制。SessionFactory的外置缓存称为hibernate的二级缓存

     二级缓存由sessionFactory负责管理,SessionFactory的生命周期和应用程序的整个进程对应。二级缓存是可选的,可以在每个类或者每个集合的粒度上配置

3、查询缓存 它是Hibernate为查询结果提供的,依赖于二级缓存。

缓存的作用范围

  1. 事物范围 每个事物都有自己的缓存,缓存内数据不会被多个事物并发访问。例如,Hibernate的一级缓存,事物是不能跨多个Session的,Session内数据只能被当前事物访问,因此它属于事物范围内的缓存。
  2. 进程范围 进程内的所有事物共享缓存,进程结束,缓存结束生命周期。例如,Hibernate的二级缓存,SessionFactory对象的生命周期对应应用程序的整个进程,因此它属于进程范围的缓存。
  3. 集群范围 缓存被一个或多个机器上的进程共享。hibernate的二级缓存也可以作为集群范围的缓存。

Hibernate 一级缓存

Session内的缓存即一级缓存。位于缓存中的对象称为持久化对象,它和数据库中的相关记录对应。Session能够在某些时间点(session.flush(); ,tx.commit(); ),按照缓存中对象的变化来执行相关的SQL语句,从而同步更新数据库,这一过程称为刷新缓存。

当应用程序调用 session的 ‘save() ,update() ,saveOrUpdate() ,load() ,get()'等方法,以及调用Query查询接口的' getResultList()'时,如果在'Session'缓存中还不存在相应的对象,Hibernate就会把该对象加入到缓存中,在刷新缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。

综上所述,Session缓存有两大作用:

  1. 减少访问数据库的频率
  2. 保证数据库中的相关记录和缓存中的相应对象同步

session缓存管理方法

  1. evict(); 从session缓存中清除某个对象
  2. clear(); 清空session缓存

ps: flush()强制进行从缓存到数据库的同步

Hibernate 二级缓存

二级缓存是进程或集群范围内的缓存,可以被所有的Session共享,其生命周期和SessionFactory一样。

二级缓存是可配置的插件,Hibernate打包了一些开源缓存实现,提供对他们的内置支持

缓存插件 缓存实现类 查询缓存
EHCache org.hibernate.cache.EhCacheProvider 支持
OSCache org.hibernate.cache.OSCacheProvider 支持
SwarmCache org.hibernate.cache.SwarmCacheProvider 不支持
JBossCache org.hibernate.cache.TreeCacheProvider 支持

为了把上边的缓存插件集成到Hibernate中,Hibernate提供了CacheProvider接口,它是缓存插件与Hibernate之间的适配器。

表格中的实现类是CacheProvider接口的不同实现。

配置二级缓存的步骤如下:

  1. 选择合适的缓存插件,配置其自带的配置文件
  2. 选择需要使用二级缓存的持久化类,设置它的二级缓存的并发访问策略。

以EHCache配置为例,步骤如下

1、将ehcache.xml文件添加到类路径下

     在路径'hibernate-release-5.2.6.Final\project\etc\'下复制'ehcache.xml'

     标签为每个需要二级缓存的类和集合设定缓存的数据过期策略,配置如下

2、开启二级缓存,在hibernate.cfg.xml配置


true

3、指定缓存产品提供商



 
 org.hibernate.cache.EhCacheProvider

org.hibernate.cache.EhCacheRegionFactory

4、指定使用二级缓存的持久化类。修改持久化类的映射文件,为元素添加元素,配置如下:

<&#63;xml version="1.0" encoding="UTF-8"&#63;>
 
 
 
 
 
 
 
 
 
 

cache 的属性

  • usage 是必须的,指定并发访问策略,取值为 transactional(事物缓存),read-write(读/写缓存),nonstrict-read-wirte(非严格读/写缓存),或read-only(只读缓存)。
  • region 可选,默认为类或集合的名字
  • include 可选,取值为non-lazy(当缓存一个对象时,不会缓存它的映射为延迟加载的属性)、all,默认值为all

或者在 hibernate.cfg.xml 的mapping元素后面统一配置 (推荐)

关闭二级缓存交互

有时候考虑到内存开销问题,需要关闭与二级缓存的交互,可以调用session的' setCacheMode(CacheMode.IGNORE)方法关闭与二级缓存的交互;

CacheMode.IGNORE参数的意思是当前session和二级缓存不再相互作用

二级缓存使用场景

二级缓存并非适合所有场景,使用不当,反而会降低性能。符合如下条件就适合放入二级缓存

  1. 很少修改的数据
  2. 不是很关键的数据,能容忍短时间内督导过期数据
  3. 应用参考的常量数据。它的实例数目有限,实例会被许多其他类的实例引用,实例极少或从来不被修改

二级缓存不适用场景

  1. 经常修改的数据
  2. 财务数据,绝对不允许读到过期数据
  3. 与其他应用共享的数据。如果其他应用修改了数据库中的数据,Hibernate无法自动保证二级缓存的数据与数据库一致

如果不设置“查询缓存”,那么hibernate只会缓存单个持久化对象,如果想缓存使用 findall()list()Iterator()createCriteria()createQuery()等方法获得的数据结果集的话, 就需要在配置文件中设置 hibernate.cache.use_query_cache true 才行

Hibernate查询缓存

上面说到的二级查询,只有在基于id查找对象时才会用到,对于查询则毫无用处。为此,Hibernate提供了针对的查询的查询缓存。

查询缓存依赖于二级缓存,因此使用查询缓存之前要按步骤配置好二级缓存

使用查询缓存的步骤如下

1、在hibernate.cfg.xml中开启查询缓存


true

2、在程序中启用查询缓存

query.setCacheable(true);

查询缓存的使用场景

  1. 经常使用的查询语句
  2. 对于查询的数据很少有插入、删除或者更新操作

Hibernate性能优化

Hibernate主要从一下几个方面来优化查询性能

  1. 使用迫切左外链接或迫切内链接查询策略、查询缓存等方式,减少select语句的数目,降低访问数据库的频率
  2. 使用延迟加载查询策略等方式避免加载多余的不需要访问的数据
  3. 使用Query接口的iterate()方法减少select语句中的字段,从而降低访问数据库的数据量

HQL优化

HQL优化hibernate程序性能优化的一个方面,HQL的语法和SQL非常类似。HQL是基于SQL的,只是增加了面向对象的封装,如果抛开HQL通Hibernate本身一些缓存机制的关联,HQL的优化技巧通SQL的优化技巧一样,在编写HQL时,需要主要以下几个原则

  1. 避免 or操作的使用不当。如果where子句中有多个条件,并且其中某个条件没有索引,使用or,将导致全表扫描。
  2. 避免使用 not 。如果where子句的条件包含not关键字,那么执行时该字段的索引失效。这些需要分成不同情况区别对待,对于 不大于(不多于)、不小于(不少于)建议使用运算符来替代not
  3. 避免like的特殊形式。某些情况下,会在where子句条件中使用用like。如果like以一个“%”或“_”开始即前模糊,则该字段的索引不起作用。目前没有什么解决 办法。
  4. 避免 having子句。在分组查询中,可在两个位置指定条件,一是where子句中,二是having子句中。尽可能的在where子句而不是在having子句中指定条件。having是在检索出所有记录后对结果集进行过滤。这个处理需要一定的开销,而where子句限制记录数目,能减少这方面的开销
  5. 避免使用 distinct 。指定distinct会导致在结果中删除重复的行,这会对处理时间造成一定的影响。
  6. 索引在以下情况失效,应注意使用

       只要对字段使用函数,该字段的索引将不起作用。

       只要对该字段进行计算,该字段的索引将不起作用。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


推荐阅读
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 本文探讨了如何在Java中使用JAXB解组两个具有相同名称但不同结构的对象。我们将介绍一个抽象类Bar及其具体实现,并展示如何正确地解析XML文档以获取正确的对象实例。 ... [详细]
  • springMVC JRS303验证 ... [详细]
  • 本文详细介绍了如何正确配置Java环境变量PATH,以确保JDK安装完成后能够正常运行。文章不仅涵盖了基本的环境变量设置步骤,还提供了针对不同操作系统下的具体操作指南。 ... [详细]
  • 本文将详细介绍通过CAS(Central Authentication Service)实现单点登录的原理和步骤。CAS由耶鲁大学开发,旨在为多应用系统提供统一的身份认证服务。文中不仅涵盖了CAS的基本架构,还提供了具体的配置实例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 近期我们开发了一款包含天气预报功能的万年历应用,为了满足这一需求,团队花费数日时间精心打造并测试了一个稳定可靠的天气API接口,现正式对外开放。 ... [详细]
  • 本文介绍了一种根据目标检测结果,从原始XML文件中提取并分析特定类别的方法。通过解析XML文件,筛选出特定类别的图像和标注信息,并保存到新的文件夹中,以便进一步分析和处理。 ... [详细]
  • 烤鸭|本文_Spring之Bean的生命周期详解
    烤鸭|本文_Spring之Bean的生命周期详解 ... [详细]
  • Servlet过滤器入门:实现与配置
    本文介绍如何在Java Web应用中实现和配置Servlet过滤器,通过实现`javax.servlet.Filter`接口来创建过滤器,并详细说明其在web.xml文件中的配置方法。 ... [详细]
  • 俗话说得好,“工欲善其事,必先利其器”。这句话不仅强调了工具的重要性,也提醒我们在任何项目开始前,准备合适的工具至关重要。本文将介绍几款C语言编程中常用的工具,帮助初学者更好地选择适合自己学习和工作的编程环境。 ... [详细]
  • 本文将详细介绍如何安装和使用 CactiEZ 的中文版本,帮助那些对英文界面不太熟悉的用户轻松掌握这一强大的网络监控工具。 ... [详细]
  • Win10 UWP 开发技巧:利用 XamlTreeDump 获取 XAML 元素树
    本文介绍如何在 Win10 UWP 开发中使用 XamlTreeDump 库来获取和转换 XAML 元素树为 JSON 字符串,这对于 UI 单元测试非常有用。 ... [详细]
  • 本文详细介绍了JSP(Java Server Pages)的九大内置对象及其功能,探讨了JSP与Servlet之间的关系及差异,并提供了实际编码示例。此外,还讨论了网页开发中常见的编码转换问题以及JSP的两种页面跳转方式。 ... [详细]
  • RedHat 系统下配置国内 YUM 源以替代官方收费源的方法
    本文详细介绍如何在 RedHat Linux 中安装并配置 YUM 包管理器,并通过使用国内镜像源来解决因未购买官方服务而导致的更新源限制问题。 ... [详细]
  • Eclipse 中 JSP 开发环境配置指南
    本文详细介绍了如何在 Eclipse 集成开发环境中配置 JSP 运行环境,包括必要的软件下载、Tomcat 服务器的配置以及常见问题的解决方法。 ... [详细]
author-avatar
无休止的等待Happy_212
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有