本系列前序文章索引:
- 程序员必须掌握的性能调优:老兵哥结合个人经历解释了程序员往架构师方向发展时为什么要跨越性能调优这一关,以及介绍了从 X、Y、Z 三个维度优化性能的思路。
- 从 X 维度优化系统的性能:老兵哥分享了从 X 维度优化系统性能的思路,包括让客户端分计算存储任务、优化交互设计等,主要是作为引子拓宽我们性能调优的思路。
- 应用容器 Tomcat 性能调优:老兵哥介绍了从 Y 维度通过优化应用容器(Tomcat)来优化系统性能的方法。
- 开发框架 Spring 性能调优:老兵哥介绍了从 Y 维度通过优化开发框架(Spring)来优化系统性能的方法。
今天老兵哥将介绍通过优化对象关系映射 ORM 框架(Hibernate)等来优化系统性能的方法。
4. ORM 框架 Hibernate
对象-关系映射 ORM(Object/Relation Mapping),是伴随着面向对象软件开发方法的发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流方法,关系数据库是企业级应用环境中数据永久存储的主流数据存储系统。对象和关系是业务实体数据的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。
对象-关系映射 ORM 系统通常以中间件的形式存在,借助描述对象到关系数据库数据的映射元数据,将内存中的对象自动持久化到关系数据库中,其本质就是将数据从一种形式转换到另外一种形式。这个转换过程需要额外的开销,自然也就存在许多优化的机会,接下来我们一起来看看如何提升 ORM 框架 Hibernate 的性能。
- 一级缓存,第一级缓存是 Session 缓存,属于强制性缓存,所有请求都必须通过它。Session 对象在它自己的权利之下,在将它提交给数据库之前保存一个对象。如果你对一个对象发出多个更新,Hibernate 会尝试尽可能长地延迟更新来减少发出的 SQL 更新语句的数目。如果你关闭 Session,所有缓存的对象丢失,或是存留,或是在数据库中被更新。
- 二级缓存,第二级缓存是可选择的,第一级缓存在任何想要在第二级缓存中找到一个对象前被询问。第二级缓存可以在每一个类和每一个集合的基础上被安装,并且它主要负责跨会话缓存对象。任何第三方缓存都可以和 Hibernate 合作,只要它实现 org.hibernate.cache.CacheProvider 接口。
Hibernate 的二级缓存通过两个步骤设置:第一,你必须决定好使用哪个并发策略(Transactional、Read-write、Nonstrict-read-write、Read-only);第二,你使用第三方缓存提供者来配置缓存到期时间和物理缓存属性。并发策略,负责保存缓存中的数据项和从缓存中检索它们,如何选择并发策略及配置可以查资料。
4.4 查询缓存
查询结果集也可以被缓存,只有在经常使用同样的参数进行查询时,查询缓存才会有些用处。如果要使用查询缓存,你必须打开它:hibernate.cache.use_query_cache,该设置将会创建两个缓存区域:一个用于保存查询结果集(org.hibernate.cache.StandardQueryCache);另一个则用于保存最近查询的一系列表的时间戳(org.hibernate.cache.UpdateTimestampsCache)。
在查询缓存中,它并不缓存结果集中所包含的实体的确切状态,它只缓存这些实体的标识符属性的值、以及各值类型的结果,所以查询缓存通常会和二级缓存一起使用。绝大多数的查询并不能从查询缓存中受益,所以 Hibernate 默认是不进行查询缓存的。如若需要进行缓存,请调用 Query.setCacheable(true) 方法。这个调用会让查询在执行过程中时先从缓存中查找结果,并将自己的结果集放到缓存中去。
关注「 IT老兵哥 」,赋能程序人生!点击查看:IT老兵哥 2019 全年热评博文合集

近期热评系列《 程序员必须懂的架构师入门课 》:
- 程序员为什么必须要懂架构li>
- 架构到底是什么,你知道吗li>
- 架构都有哪些,我该怎么选li>
- 架构师都干什么,你知道吗li>
- 练就哪些技能才胜任架构师li>
- 怎样才能搞定上下游的客户li>
- 如何从开发岗转型做架构师li>
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览92452 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!