2008-11-04 75 views
18

我需要能够在内存中的HSQL数据库中以每5秒至少8000个对象的一致速率插入/更新对象。我在Spring/Hibernate/JPA和纯JDBC之间做了一些比较性能测试。我发现使用HSQL的性能有显着的不同。使用Spring/Hib/JPA,我可以在5秒内插入我的1.5 KB对象中的3000-4000个(具有一对多和多对多关系),而使用直接JDBC调用我可以插入10,000-12,000个相同的对象。ORM解决方案(JPA; Hibernate)与JDBC

我不明白为什么会有这么大的差异。我已经调整了Spring/Hib/JPA设置,试图在性能上接近失败。我希望将Spring/Hib/JPA用于未来目的,可扩展性以及因为外键关系(一对多和多对多)难以手工维护;但性能要求似乎指向使用纯JDBC。

任何想法为什么会有这么大的差异?

+2

您可能想重命名这个问题,因为标题并不能很好地描述实际问题。 – 2009-03-09 18:57:10

+0

你会建议什么? – systemoutprintln 2009-03-09 20:49:22

回答

15

我们在批处理模式下比较Hibernate和JDBC(Statement#executeBatch())有类似的经验。基本上,Hibernate似乎对批量操作没有那么好。在我们的例子中,Hibernate的实现在我们的生产硬件上足够快。

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

+1

你也做过Hib批处理吗?在我的测试中,Hib批处理和JDBC批处理几乎完全相同。 – 2008-11-04 11:49:00

5

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

+1

文档可能已移动。 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch。html – JavaRocky 2010-08-06 01:09:25

2

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

当然,映射的关键不是提升性能。通常情况下,你会受到性能影响。但是,在性能方面你会失去什么,你在开发人员的生产力,一致性,可测试性,可靠性以及更多令人垂涎的属性中获得很多倍以上的好处。通常情况下,当你需要额外的性能,并且你不想放弃映射时,你可以投入更多的硬件。

9

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

而正如正义所提到的,Hib的主要目标不是计算机性能,而是开发人员的表现。话虽如此,通常可以实现JDBC结果的可比较的(不相等的,但没有那么糟糕)。

5

从不使用一种技术解决所有问题。 根据问题决定使用何种技术。 当然jpa或hibernate比jdbc慢。 jdbc比jpa低。 另外一个db专业版的jdbc可以编写比jpa更优化的sql。 如果你在需要速度的地方给出临界点,jpa不是你的选择。