ORM 解决方案(JPA;Hibernate)与 JDBC
Posted
技术标签:
【中文标题】ORM 解决方案(JPA;Hibernate)与 JDBC【英文标题】:ORM solutions (JPA; Hibernate) vs. JDBC 【发布时间】:2010-09-20 14:39:20 【问题描述】:我需要能够在内存 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。
任何想法为什么会有如此巨大的差异?
【问题讨论】:
您可能想要重命名此问题,因为标题对实际问题的描述不是很充分。 【参考方案1】:我们在批处理模式下(Statement#executeBatch())比较 Hibernate 和 JDBC 有类似的经验。基本上,Hibernate 似乎在批量操作方面做得不好。在我们的例子中,Hibernate 实现在我们的生产硬件上已经足够快了。
您可能想要做的是将数据库调用包装在 DAO 中,从而为您的应用程序提供访问数据的一致方式。在方便的地方使用 Hibernate 和在性能要求需要的地方使用 JDBC 来实现您的 DAO。
【讨论】:
您是否也进行了 Hib 批处理?在我的测试中,Hib 批次和 JDBC 批次几乎相同。【参考方案2】:至少,您需要在 Hibernate 中进行批量插入:http://www.hibernate.org/hib_docs/reference/en/html/batch.html 节省大量往返时间。
而且,正如 Just 所说,Hib 的主要目标不是计算机性能,而是开发人员性能。话虽如此,但通常可以达到与 JDBC 相当的(不等于,但也不会差很多)结果。
【讨论】:
可能看到文档已移动。在这里试试docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html 此外,文档中提到了这一点,但很容易错过。如果您正在执行插入操作并使用具有自动生成的主键的实体,批处理模式将被禁用。【参考方案3】:永远不要用一种技术解决所有问题。 根据问题决定使用什么技术。 当然 jpa 或 hibernate 比 jdbc 慢。 jdbc 的级别低于 jpa。 使用 jdbc 的 db 专业人员也可以编写比 jpa 更优化的 sql。 如果您给出了需要速度的临界点,那么 jpa 不是您的选择。
【讨论】:
【参考方案4】:Hibernate 维护对象的第一级缓存以用于脏检查以及充当工作单元和身份映射。这增加了开销,尤其是在批量类型操作中。对于批量操作,您可能需要调查不保持此状态的 StatelessSessions。
【讨论】:
文档可能已移动。 docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html【参考方案5】:所有这些映射......它可能会变得有点昂贵,所有神秘的逻辑以及它必须做的所有反射和一致性检查。
映射的目的当然不是为了提高性能。通常,您会受到性能影响。但是,您在性能上损失了什么,您(可以)在开发人员的生产力、一致性、可测试性、可靠性以及更多令人垂涎的属性方面获得了许多倍的收益。通常,当您需要额外的性能并且不想放弃映射时,您需要增加一些硬件。
【讨论】:
以上是关于ORM 解决方案(JPA;Hibernate)与 JDBC的主要内容,如果未能解决你的问题,请参考以下文章
简述 JPA 与 Spring Data JPA 与 Hibernate