如何优化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 方法执行率很高
- Org.hibernate.query.Query.getResultList()
- Org.hibernate.query.internal.AbstractProducedQuery.list()
- Org.hibernate.query.SessionImpl.executeUpdate(字符串,
查询参数)
这是什么意思?我该如何优化它?
这意味着 运行宁 SQL 查询花费了大量时间,这在典型的 CRUD 应用程序中很常见。
Query.getResultList()
涉及 select
个查询,SessionImpl.executeUpdate()
涉及 update
或 delete
个查询。
为了了解发生了什么,您必须找到执行了哪些查询。有很多方法可以做到这一点,但我最喜欢的两个是:
- 您可以在 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获取数据的进程,而不是在开始时获取一次数据
- ...
我有一个 Spring 批处理应用程序打包为 JAR 文件,如下突出显示
java -Xms2048m -Xmx2048m -Ddivision=25 -Ddate= -Denv=dv -Dconn=45 -jar demo-jobs*.jar job-definition.xml jobName -next
我想优化整体执行时间,所以我试图跟踪所有方法的平均执行时间。我正在使用 Java 飞行记录器。
我看到以下 Hibernate 方法执行率很高
- Org.hibernate.query.Query.getResultList()
- Org.hibernate.query.internal.AbstractProducedQuery.list()
- Org.hibernate.query.SessionImpl.executeUpdate(字符串, 查询参数)
这是什么意思?我该如何优化它?
这意味着 运行宁 SQL 查询花费了大量时间,这在典型的 CRUD 应用程序中很常见。
Query.getResultList()
涉及 select
个查询,SessionImpl.executeUpdate()
涉及 update
或 delete
个查询。
为了了解发生了什么,您必须找到执行了哪些查询。有很多方法可以做到这一点,但我最喜欢的两个是:
- 您可以在 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获取数据的进程,而不是在开始时获取一次数据
- ...