Hibernate是将Java Web应用程序与SQL数据库集成的好工具,但是当应用程序的响应时间开始显着增加时,我们应该怎么做? 当我们怀疑应用程序是否会随着客户群的增长而扩展时,我们该怎么办?
在花大价钱托管或重写代码之前,请考虑分析和改进Web应用程序的这7个方面。
#1调整JVM内存设置
JVM允许我们配置它将分配给运行我们的应用程序的内存量。 如果未正确配置内存设置(堆大小,perm gen大小等),则可能是垃圾回收进程运行得过于频繁,这将导致CPU使用率激增并停止执行。
#2优化JDBC数据源和Hibernate的配置
在这些配置中,我们可以定义Hibernate和底层JDBC层的一般行为。 在应用程序此部分中所做的更改(池大小,顺序等)可能会影响每个SQL查询和更新。 因此,正确设置这些设置对于您的应用程序的最佳性能至关重要。 在这里还值得一提的是Hibernate 2级缓存。 当应用程序一遍又一遍运行相同的查询时,缓存最多可以节省99%的数据库往返次数。 市场上有几种可以用作二级缓存提供程序的缓存框架,其中最著名的是EHCache , Oracle Coherence , Infinispan和Hazelcast 。
#3优化休眠映射
无论我们是使用批注还是XML文件来配置Hibernate映射,几行更改(延迟加载,批处理等)都可以大大提高应用程序的性能。 这些映射直接影响Hibernate将生成和执行哪些SQL语句。 在大多数情况下,使用默认映射配置可能效果很好,但是针对关键的SQL查询和更新对其进行优化可能会大大增加与数据库的往返次数以及执行所花费的实际时间。
#4优化Hibernate会话管理
在处理事务时,了解不同的隔离级别和传播类型以及将只读和读写DB操作拆分为单独的事务是关键。
#5添加缺少的数据库索引
有几种方法可以识别最耗费资源的SQL语句,但是一旦有了它们的列表,添加必要的索引就变得很简单。 没有这些索引,数据库可能必须逐行读取整个数据库表。 这是数据库中最耗费资源的操作之一,绝对是我们要避免的事情。
#6改善SQL语句
一些由Hibernate生成的SQL语句可能包含许多不必要的联接操作。 这是确保SQL语句爬网的一种可靠方法。 我们必须确保仅包含绝对必要的联接。 要记住的另一件事是如何组织WHERE条件来过滤结果集。 选择错误的顺序可能会使查询速度降低一个数量级。
#7重构Java代码
代码中最典型的问题之一是N + 1查询问题,我们运行查询以获取项目列表,然后遍历这些项目以对每个项目运行单独的查询。 单独使用这种反模式可以终止大多数扩展应用程序的尝试,并且可能使我们在托管方面付出巨大的代价。 由于其修复需要代码重构 ,因此它是最复杂,最昂贵的性能问题之一。
摘要
当所有尝试似乎都无法解决性能问题时,仍然存在希望。 上述项目可能有助于在主要瓶颈升级为更大的问题之前对其进行识别。 哪些性能问题正在损害您的业务?
翻译自: https://www.javacodegeeks.com/2015/08/7-ways-to-improve-performance-of-a-hibernate-application.html