Spring JDBCTemplate VS Hibernate在性能方面

时间:2012-08-03 07:24:13

标签: spring hibernate jdbctemplate

在我们的项目中,我们必须在Spring JDBCTemplate和Hibernate之间做出决定。

我想知道在性能,实施和设计方面哪个更好。以及如何?

4 个答案:

答案 0 :(得分:49)

如果您尽一切努力使两种实现都非常快,那么JDBC模板可能会更快一些,因为它没有Hibernate的开销。但它可能需要更多的时间和代码行来实现。

Hibernate有它的学习曲线,你必须了解幕后发生的事情,何时使用投影而不是返回实体等等。但是如果你掌握了它,你将获得更多的时间并且比代码更清晰,更简单。使用基于JDBC的解决方案。

我想说在95%的情况下,Hibernate足够快,甚至比非优化的JDBC代码更快。对于剩下的5%,没有什么禁止你使用别的东西,例如Spring-JDBC。两种解决方案都不是相互排斥的。

答案 1 :(得分:35)

这取决于您的项目以及Hibernate模型与您的思维方式的匹配程度。速度/性能是无关紧要的:如果你无法理解Hibernate的工作原理,那么你的项目将会充满奇怪的错误,这些错误需要很长时间才能找到并修复。

另请注意,Hibernate的内部会泄漏到您的模型和DAO中。值得注意的冲突点通常是equals()/hashCode()和交易之外的集合的延迟加载。由于Hibernate的示例非常简单,您可以在短时间内实现很多,这可能会导致误解Hibernate很简单。不是。 Hibernate做了很多假设,迫使你以某种方式思考和编码。

使用JdbcTemplate更容易,因为它只是JDBC本身的一个非常薄的包装器。这里的价格是你会写出数千行非常无聊的代码。此外,您会发现SQL字符串很难维护。当您的数据模型发生变化时,您必须在整个代码库中搜索可能受影响的所有地方。它不会很漂亮。

对于我们自己的项目,我们决定不使用Hibernate,因为我们有非常复杂的数据结构(修订的树结构),并且必须在运行时构建复杂的搜索查询。相反,我们使用jOOQ编写了自己的DAO图层。 jOOQ是一个围绕JDBC的瘦包装器,它允许您使用Java中的一个不错的DSL编写SQL:

create.selectFrom(BOOK)
      .where(PUBLISHED_IN.equal(2011))
      .orderBy(TITLE)

和Hibernate一样,jOOQ有一些你应该遵循的规则,否则你会不高兴,但这些规则要宽松得多。

作为另一种选择,您应该看一下Spring Data。简而言之,Spring Data允许您将数据存储到远程类似于数据库的任何内容中。这意味着您可以使用Hibernate管理模型,使用NoSQL数据库管理另一个模型。或者,您可以根据需要轻松迁移部分模型。

其中一个关键功能是DAO 实施如下所示:

public interface UserRepository extends Repository<User, Long> {

  List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);
}

现在您可能想知道实现的位置,因为这只是一个带有方法定义的接口,但就是这样。在运行时,Spring Data将为您生成实现此方法的代码。这是可能的,因为您需要的所有查询中有99%的格式为“列X为...的所有行的查询表”,因此他们优化了此用例。

OTOH,如果你已经知道你将在运行时构建非常复杂的搜索查询,那么Spring Data可能没那么大的帮助。

答案 2 :(得分:15)

在我们的项目中,我们同时使用JdbcTemplateHibernate。您需要做的是在DataSourcehibernate之间共享jdbcTemplate。 我们可以根据操作检查两者的性能,无论哪个更好,我们使用更好的一个。大多数情况下,我们使用hibernate进行正常操作,如果有大量查询或繁重的操作,我们会检查jdbc和hibernate的性能,无论我们使用它们哪个更好。

好的一点是HibernateTransactionManager适用于(JdbcTemplate,普通jdbc)和hibernate。

答案 3 :(得分:0)

您的数据库设计是否适合hibernate?如果是,那么使用休眠...如果没有,那么你可能想避免它。 Jdbctemplate有许多优点,有很多方法可以确保您的SQL查询易于维护。有一个包含所有这些内容的类或从文件中读取它们等。如果必须更新列,则可以使用标准jdbc获取结果集元数据,以便检索列名。这可能很复杂,但却是解决问题的有趣方法。 Hibernate是一个很棒的工具,但复杂的数据模型使它变得非常棘手。