【问题标题】:Awful performance of JPA batch processing compared to Hibernate or JDBC与 Hibernate 或 JDBC 相比,JPA 批处理的性能很差
【发布时间】:2012-08-29 21:50:42
【问题描述】:

我最近需要创建一个批处理来读取具有数百万行的表。该表大约有 12 列,我只需要执行read 操作。但我需要所有字段,因此我考虑使用持久性对象。

我真的只使用了最基本的代码来实现这一点,没有任何调整。 JPA 很烦人,因为它迫使我使用带有 maxResultsminResults 的自定义分页。如果您有兴趣,可以查看下面的大致代码超链接。除了默认的 XML 文件等之外,真的没有别的东西了。

JPA 代码:http://codeviewer.org/view/code:297e
休眠代码:http://codeviewer.org/view/code:297f
JDBC 代码:与上面相同,但末尾带有“d”(对不起,我只能发布 2 个链接)

完成操作的时间结果是这样的。我只是在谈论读取操作:

JPA:         Per 5 seconds: 1.000||Per Minute: 12.000||Per Hour: 720.000
Hibernate:   Per 5 seconds: 20.000||Per Minute: 240.000||Per Hour: 14.400.000
JDBC:        Per 5 seconds: 50.000-80.000||Per Minute: 600.000-960.000||Per Hour: 36.000.000-57.600.000

我无法解释,但 JPA 很荒谬。这只能是一个很大的坏笑话。有趣的是,它以与 Hibernate 代码相同的速度开始,但在大约 30.000 条记录之后,它变得越来越慢,直到它稳定在每 5 秒 1.000 次读取操作。它在完成大约 100.000 条记录后达到了这一点。但老实说……这样的速度毫无意义。

为什么会这样?请给我解释一下。我真的不知道我做错了什么。但我也认为它不应该那么慢,即使使用默认设置。不可能,也不应该!与 Hibernate 和JDBC 相比,速度始终可以接受且稳定。

【问题讨论】:

  • 提供者是 org.hibernate.ejb.HibernatePersistence
  • 您是否尝试过更大的页码大小(20 非常小,因此会导致在 JPA 代码中执行大量查询),并避免刷新 EM(因为它是读取-only 操作,没有要刷新的内容,但是刷新会导致 Hibernate 检查所有缓存实体的脏度)。

标签: performance hibernate jpa jdbc batch-file


【解决方案1】:

使用 Hibernate,您只需使用一个查询和可滚动的结果即可获得良好的性能。不幸的是,目前这在 JPA 中是不可能的,您必须对每个结果页面执行查询。

所以,你做对了。但是您的页面大小仅设置为 20 个结果。这很少,因此您的代码会进行大量查询。尝试更大的尺寸,例如 10000 个结果,性能可能会提高。无论如何,我认为您将无法获得接近 Hibernate 的数字。

【讨论】:

  • 就是这样!我刚刚尝试了 10.000 作为 pageSize,它的运行速度几乎与 Hibernate 批处理一样快。我只是习惯了 20 或 50 页大小,因为大多数教程都使用了如此低的值。我的错。谢谢,你拯救了我的一天:)
猜你喜欢
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 2012-10-07
  • 2012-04-08
  • 2020-11-16
  • 1970-01-01
  • 2017-01-31
相关资源
最近更新 更多