对于大多数典型的 Spring/Hibernate 企业应用而言,其性能表现几乎完全依赖于持久层的性能。此篇文章中将介绍如何确认应用是否受数据库约束,同时介绍七种常用的提高应用性能的速成法。本文系 OneAPM 工程师编译整理。
如何确认应用是否受限于数据库
确认应用是否受限于数据库的第一步,是在开发环境中进行测试,并使用 VisualVM 进行监控。VisualVM 是一款包含在 JDK 中的 Java 分析器,在命令行输入 jvisualvm
即可调用。
启用 Visual VM 之后,尝试以下步骤:
- 双击你正在运行的应用
- 选择
Sampler
- 点击
Settings
复选框 - 选择
Profile only packages
,然后输入下列包:
your.application.packages.*
org.hibernate.*
org.springframework.*
your.database.driver.package
, 比如 oracle.*
点击 Sample CPU
如果应用性能受限于数据库,其 CPU 分析结果看起来会像下图:
我们看到,客户端 Java 进程花在等待数据库从网络中返回结果的时间占56%。
看到数据库查询是导致应用运行缓慢的原因,其实是好兆头。Hibernate 反射调用占比32.7%是正常情况,无法进一步优化。
性能调优第一步:定义基准运行
性能调优的第一步是为程序定义基准运行,我们要定义一组能有效执行的输入数据,让程序基准运行与生产环境下的运行差不多。
主要的区别在于基准运行的耗时要小很多。作为参考,5到10分钟的执行时间比较不错。
什么是好的基准?
好的基准应该具备以下特征:
- 功能正确
- 输入数据的种类与生产环境下相似
- 在短时间内执行完毕
- 基准运行的优化方案可以外推至完整运行