如何优化Hibernate执行时间?

How to optimize the Hibernate execution time?

我有一个 Spring 批处理应用程序打包为 JAR 文件,如下突出显示

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

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

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

  1. Org.hibernate.query.Query.getResultList()
  2. Org.hibernate.query.internal.AbstractProducedQuery.list()
  3. Org.hibernate.query.SessionImpl.executeUpdate(字符串, 查询参数)

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

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

Query.getResultList() 涉及 select 个查询,SessionImpl.executeUpdate() 涉及 updatedelete 个查询。

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

  • 您可以在 Hibernate 中 log SQL statements,这将为 运行 的每个查询生成一个日志。根据您的应用程序,这可能会记录很多查询,可能太多而没有任何用处。
  • 您可以使用像 YourKit (a commercial product, but it has a 15-days trial which should be enough for your problem). In addition to CPU/memory analysis, YourKit can also monitor queries run via JDBC 这样的分析器。它基本上会列出所有已执行的查询,每个查询执行了多少次运行,以及执行它们的方法。

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

可能出现的问题:

  • N+1 queries
  • where 子句中使用的列缺少索引(请注意,外键在某些数据库中不会自动编制索引)
  • 一个循环从某些配置table获取数据的进程,而不是在开始时获取一次数据
  • ...