我最近需要创建一个批处理来读取包含数百万行的表。该表大约有 12 列,我只需要执行 read
操作。但我需要所有字段,因此我考虑使用持久性对象。
我实际上只使用了最基本的代码来实现这一点,并且没有进行任何调整。 JPA
非常烦人,因为它迫使我使用带有 maxResults
和 minResults
的自定义分页。如果您有兴趣,可以查看下面的大致代码超链接。除了默认的 XML 文件等之外,实际上没有其他任何东西。
JPA 代码:http://codeviewer.org/view/code:297e
hibernate 代码: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 相比,速度是可以接受的并且始终稳定。
最佳答案
使用 Hibernate,您只需使用一次查询和可滚动结果即可获得良好的性能。不幸的是,这在 JPA 中目前是不可能的,并且您必须对每个结果页面执行查询。
所以,你做得对。但您的页面大小仅设置为 20 个结果。这个数量非常少,因此您的代码会进行大量查询。尝试使用更大的大小,例如 10000 个结果,性能可能会提高。无论如何,我认为您将无法获得接近 Hibernate 的数字。
关于performance - 与 Hibernate 或 JDBC 相比,JPA 批处理的性能很糟糕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12276987/