java - Hibernate loader 在 System.identityHashCode 中花费大量时间
问题描述
我ScrollableResults
在 Hibernate 中使用并遍历数百万条记录。这需要相当长的时间,所以我使用 YourKit 进行了一些分析,以尝试找出我们如何使这个迭代更快。我预计大部分时间都花在从 Oracle 获取数据或水合对象上……但令我惊讶的是,它似乎花费了大量时间调用System.identityHashCode
.
简介的相关部分:
这里有 3 件主要的事情似乎需要时间:
T4CPreparedStatement.fetch
- 这是从 Oracle 获取的,大约花费了 13% 的时间。AbstractEntityPersister.hydrate
- 这是从ResultSet
. 相当大,但我认为我可以通过其他方式减轻很多这种情况。大约 29% 的时间。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);
所以,有几个问题:
- 有没有办法完全避免
StatefulPersistenceContext.addEntity
?我们不会修改返回的这些实体中的任何一个,它纯粹是只读的,所以我不确定为什么我们需要一个持久的上下文......尽管我承认,我对 Hibernate 内部的了解严重缺乏。 - 有没有办法加快速度
System.identityHashCode
?该对象有很多属性,主要是字符串和浮点数,但也有两个LocalDate
属性。改善物体水合作用的部分内容将从LocalDate
变为Integer
... 有帮助吗?不幸的是,YourKit 不允许我在那里进一步钻探(可能是因为它是一种native
方法),所以我不知道。
非常感谢任何见解!
解决方案
推荐阅读
- gradle - org.gradle.tooling.GradleConnectionException:无法获取“BuildEnvironment”类型的模型
- java - Android Studio 在打字时卡住了
- javascript - mongoDB 通过 find 得到“未定义”
- javascript - 转移焦点() - Angular 5
- php - 在多个数组中查找项目
- javascript - 带有函数和 this 的 Javascript 对象
- vue.js - 在 vuejs 中定义数据模式的正确模式
- docker - AWS ECS 为每个微服务运行实例
- python - 在 Pandas 中选择具有相同 ID 但不同值的行
- ios - iOS:JSON 上传进度