【发布时间】:2012-08-29 21:50:42
【问题描述】:
我最近需要创建一个批处理来读取具有数百万行的表。该表大约有 12 列,我只需要执行read 操作。但我需要所有字段,因此我考虑使用持久性对象。
我真的只使用了最基本的代码来实现这一点,没有任何调整。 JPA 很烦人,因为它迫使我使用带有 maxResults 和 minResults 的自定义分页。如果您有兴趣,可以查看下面的大致代码超链接。除了默认的 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