2

我最近需要创建一个批处理来读取具有数百万行的表。该表大约有 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 条记录后达到了这一点。但老实说……这样的速度毫无意义。

为什么呢?请给我解释一下。我真的不知道我做错了什么。但我也认为它不应该那么慢,即使使用默认设置。不可能,也不应该!相比之下,休眠和JDBC速度一直是可以接受和稳定的。

4

1 回答 1

4

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

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

于 2012-09-05T08:28:27.213 回答