performance - 与 Hibernate 或 JDBC 相比,JPA 批处理的性能很糟糕

标签 performance hibernate jpa jdbc batch-file

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

我实际上只使用了最基本的代码来实现这一点,并且没有进行任何调整。 JPA 非常烦人,因为它迫使我使用带有 maxResultsminResults 的自定义分页。如果您有兴趣,可以查看下面的大致代码超链接。除了默认的 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/

相关文章:

c - efficiency int 与 long long 赋值

推荐使用相同索引向量对两个向量进行子集化的方法

Hibernate Criteria API-HAVING子句解决方法

java - 如何设置 spring.jpa.properties.hibernate.show_sql : false for specific "session.save(Entity)" in a java class

mongodb - 如何通过Hibernate OGM和JPA在MongoDB中创建 "unique"约束

c - 数组与 memcpy 比较 vs 逐元素比较

mysql - 使用复合索引优化 MySQL 查询

java - Hibernate 不在 oracle 数据库中创建表

java - 如何在应用程序启动时从 java 代码更改 Hibernate connection.url 属性

mysql - 当我更新多对多关系中的实体时,如何阻止 Hibernate/JPA 删除连接表记录?