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

时间:2008-11-04 02:25:33

标签: performance hibernate spring jpa jdbc

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

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

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

为什么会出现这么大的差异?

5 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:10)

至少,你需要在Hibernate中进行批量插入:http://www.hibernate.org/hib_docs/reference/en/html/batch.html节省了大量的往返时间。

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

答案 2 :(得分:5)

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

答案 3 :(得分:5)

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

答案 4 :(得分:2)

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

映射的关键当然不是为了提升性能。通常,您会受到性能影响。但是你在性能方面的损失,你(可以)在开发人员的工作效率,一致性,可测试性,可靠性以及更多令人垂涎的属性方面获得了很多倍。通常,当您需要额外的性能并且您不想放弃映射时,您可以使用更多的硬件。