0

我有一个打包为 JAR 文件的 Spring Batch 应用程序,如下所示

java -Xms2048m -Xmx2048m -Ddivision=25 -Ddate= -Denv=dv -Dconn=45 -jar demo-jobs*.jar job-definition.xml jobName -next

我想优化整体执行时间,所以我试图跟踪所有方法的平均执行时间。我正在使用 Java Flight Recorder。

我看到以下 Hibernate 方法执行率很高

  1. org.hibernate.query.Query.getResultList()
  2. org.hibernate.query.internal.AbstractProducedQuery.list()
  3. org.hibernate.query.SessionImpl.executeUpdate(String, QueryParameters)

在此处输入图像描述

在此处输入图像描述

这是什么意思?我该如何优化呢?

4

1 回答 1

2

这意味着很多时间都花在了运行 SQL 查询上,这在典型的 CRUD 应用程序中很常见。

Query.getResultList()select查询有关,并且SessionImpl.executeUpdate()updatedelete查询有关。

为了了解发生了什么,您必须找出执行了哪些查询。有很多方法可以做到这一点,但我最喜欢的两个是:

  • 您可以在 Hibernate 中记录 SQL 语句,这将为运行的每个查询生成一个日志。根据您的应用程序,这可能会记录大量查询,可能太多而无法使用。
  • 您可以使用像YourKit这样的分析器(一种商业产品,但它有 15 天的试用期,应该足以解决您的问题)。除了 CPU/内存分析,YourKit 还可以监控通过 JDBC 运行的查询。它基本上会列出所有已执行的查询,每个查询运行了多少次,以及执行它们的方法。

一旦您获得了所有已执行 SQL 查询的详细信息,您就必须检查它是否与您的应用程序应该执行的操作一致。

可能出现的问题:

  • N+1 个查询
  • 子句中使用的列缺少索引where(请注意,某些数据库不会自动索引外键)
  • 在循环中从某个配置表中获取数据的过程,而不是在开始时获取一次数据
  • ...
于 2021-10-04T12:28:22.253 回答