18

我需要能够在内存 HSQL 数据库中以每 5 秒至少 8000 个对象的一致速率插入/更新对象。

我在 Spring/Hibernate/JPA 和纯 JDBC 之间做了一些比较性能测试。我发现使用 HSQL 在性能上有显着差异。使用 Spring/Hib/JPA,我可以在 5 秒内插入 3000-4000 个 1.5 KB 对象(具有一对多和多对多关系),而直接JDBC 调用我可以插入 10,000-12,000 个相同的对象。

我无法弄清楚为什么会有如此巨大的差异。我已经调整了 Spring/Hib/JPA 设置很多,试图在没有运气的情况下接近性能。我想将 Spring/Hib/JPA 用于未来用途、可扩展性,并且因为外键关系(一对多和多对多)难以手动维护;但性能要求似乎指向使用纯 JDBC。

关于为什么会有如此巨大的差异的任何想法?

4

5 回答 5

16

我们在批处理模式(Statement#executeBatch())中比较 Hibernate 和 JDBC 有类似的经验。基本上,Hibernate 似乎在批量操作方面做得不好。在我们的例子中,Hibernate 实现在我们的生产硬件上已经足够快了。

您可能想要做的是将数据库调用包装在 DAO 中,为您的应用程序提供一种一致的方式来访问您的数据。在方便的地方使用 Hibernate 和在性能要求需要的地方使用 JDBC 来实现您的 DAO。

于 2008-11-04T02:54:20.027 回答
10

作为最低要求,您需要在 Hibernate 中进行批量插入:http : //www.hibernate.org/hib_docs/reference/en/html/batch.html 节省大量往返时间。

而且,正如Justice 所说,Hib 的主要目标不是计算机性能,而是开发人员性能。话虽如此,通常可以实现与 JDBC 结果相当(不等于,但也不会差很多)。

于 2008-11-04T11:10:36.220 回答
5

Hibernate 维护对象的一级缓存以用于脏检查以及充当工作单元和身份映射。这增加了开销,尤其是在批量类型操作中。对于批量操作,您可能需要调查不保持此状态的StatelessSession 。

于 2008-11-04T02:47:18.093 回答
5

永远不要用一种技术解决所有问题。根据问题决定使用什么技术。当然 jpa 或 hibernate 比 jdbc 慢。jdbc 的级别低于 jpa。使用 jdbc 的 db 专业人员也可以编写比 jpa 更优化的 sql。如果您给出了需要速度的临界点,那么 jpa 不是您的选择。

于 2010-04-20T08:39:12.660 回答
2

所有这些映射......它可能会变得有点昂贵,所有神秘的逻辑以及它必须做的所有反射和一致性检查。

当然,映射的目的不是提高性能。通常,您会受到性能影响。但是你在性能上损失了什么,你(可以)在开发人员的生产力、一致性、可测试性、可靠性和更多令人垂涎的属性方面获得了很多倍的收益。通常,当您需要额外的性能并且不想放弃映射时,您需要增加一些硬件。

于 2008-11-04T02:59:36.273 回答