3

我刚刚负责一个应用程序,其目标是提取大量数据(从包含 10,000,000 行的表中提取多达 100,000 行)。不幸的是,提取是用Java + Hibernate编写的,性能相对较差。使用 Java + Hibernate 提取 100,000 行大约需要 1 分 30 秒。使用Talend进行相同的提取大约需要 30 秒(少 3 倍)。

以下是代码的示例:

Launcher.initStatelessSession();
Launcher.beginStatelessTransaction();

//Creation of the Criteria crit, no join, only a single table is read.
int fetchSize = 1000;
crit.setFetchSize(fetchSize);
crit.setCacheable(false);
crit.setReadOnly(true);

ScrollableResults result = crit.scroll(ScrollMode.FORWARD_ONLY);
// Most of the time is spent from HERE ...
while (result.next()) {
   // Some code but insignificant time compared to the result.next().
   // I replaced this code with continue; and the speed did not really change.
}
// ... to HERE

关于可以加快此查询的优化的任何想法?目前,没有计划放弃 Hibernate 去做其他事情。

4

1 回答 1

0

我不知道 talend 是什么,但我怀疑它是某种数据库 gui 工具?

在这种情况下,可能的原因是休眠使对象脱水,即检查检索到的对象是否不在会话中,创建一个实例并填充所有属性(可能与其他引用的实体)。

使用分析器更详细地了解实际情况

所有这些都假设您实际上执行了相同的 sql 语句。如评论中所述,根据您的标准和您的映射休眠可能会创建非常“有趣”的选择语句。

于 2012-05-09T11:55:30.637 回答