首页 > 解决方案 > Hibernate loader 在 System.identityHashCode 中花费大量时间

问题描述

ScrollableResults在 Hibernate 中使用并遍历数百万条记录。这需要相当长的时间,所以我使用 YourKit 进行了一些分析,以尝试找出我们如何使这个迭代更快。我预计大部分时间都花在从 Oracle 获取数据或水合对象上……但令我惊讶的是,它似乎花费了大量时间调用System.identityHashCode.

简介的相关部分:

ScrollableResults.next() 配置文件

这里有 3 件主要的事情似乎需要时间:

  1. T4CPreparedStatement.fetch- 这是从 Oracle 获取的,大约花费了 13% 的时间。
  2. AbstractEntityPersister.hydrate- 这是从ResultSet. 相当大,但我认为我可以通过其他方式减轻很多这种情况。大约 29% 的时间。
  3. EntityEntryContext.addEntityEntry- 这是我不知道如何改进的地方,因为它都花在了System.identityHashCode。这是执行时间的 58%。

我会注意到这是一个相当旧的 Hibernate 版本:4.3.11,以及旧的 JDK 8。

ScrollableResults是这样创建的:

CriteriaQuery query = ...;
ScrollableResults results = entityManager.createQuery(query)
    .unwrap(Query.class)
    .setReadOnly(true)
    .setFetchSize(20000)
    .setCacheable(false)
    .scroll(ScrollMode.FORWARD_ONLY);

所以,有几个问题:

非常感谢任何见解!

标签: javahibernatejpa

解决方案


推荐阅读