ORM解决方案 (JPA; Hibernate) 与 JDBC

18

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

我已经进行了Spring/Hibernate/JPA和纯JDBC之间的性能比较测试。我发现在使用HSQL时,性能存在显著差异。使用Spring/Hib/JPA,我可以在5秒钟内插入3000-4000个具有一对多和多对多关系的1.5KB对象,而使用直接的JDBC调用,则可以插入10000-12000个相同对象。

我无法弄清楚为什么会存在如此巨大的差异。我尝试过很多次调整Spring/Hib/JPA的设置,试图在性能上接近但没有成功。我想在将来的目标、可扩展性以及由于外键关系(一对多和多对多)手动维护困难的情况下使用Spring/Hib/JPA,但性能要求似乎指向使用纯JDBC。

有何想法,为什么会存在如此巨大的差异?


2
您可能想要将此问题重命名,因为标题对实际问题的描述不够具体。 - James McMahon
5个回答

16

我们有类似的经验,比较了Hibernate与JDBC在批处理模式(Statement#executeBatch())下的表现。基本上,Hibernate在批量操作方面表现不太好。然而,在我们的生产硬件上,Hibernate的实现速度已经足够快了。

你可能想要做的是将数据库调用封装在DAO中,给你的应用程序提供一种统一访问数据的方式。在方便的情况下,使用Hibernate实现你的DAO,在性能要求高的情况下,使用JDBC实现。


1
你也做了Hib批处理吗?在我的测试中,Hib批处理和JDBC批处理几乎相同。 - Vladimir Dyuzhev

10

最起码,你需要在Hibernate中进行批量插入:http://www.hibernate.org/hib_docs/reference/en/html/batch.html 这样做可以节省大量往返时间。

正如Justice所提到的,Hib的主要目标不是计算机性能,而是开发人员的性能。话虽如此,通常可以实现与JDBC结果相当(不完全相同,但差别不会太大)。


文档可能已经移动。请尝试在此处查看:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html - JavaRocky
同时,文档提到但很容易被忽略的是,如果您正在插入并处理具有自动生成主键的实体,则批处理模式将被禁用或忽略。 - Pace

5

永远不要为所有问题使用一种技术。 根据问题决定使用什么技术。 当然,JPA或Hibernate比JDBC慢。 JDBC比JPA更低级。 此外,具有JDBC的数据库专业人员可以编写比JPA更优化的SQL。 如果您需要速度是关键点,则JPA不是您的选择。


5
Hibernate维护了一个一级缓存来进行脏数据检查,并充当工作单元和标识映射。这会增加开销,特别是在批量操作中。对于批量操作,您可能需要研究不维护此状态的StatelessSessions。请参考StatelessSessions

1
文档可能已经移动。http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html - JavaRocky

2
所有这些映射...它可能会变得有点昂贵,因为它必须执行所有的奥秘逻辑、反射和一致性检查。
当然,映射的目的不是提高性能。通常情况下,你会遇到性能问题。但是,你在性能上失去的东西,你可以在开发人员生产力、一致性、可测试性、可靠性等许多令人垂涎的属性中获得很多倍的回报。通常情况下,当你需要额外的性能而又不想放弃映射时,你可以添加更多的硬件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接