【问题标题】:Spring JDBCTemplate VS Hibernate in terms of performance [closed]Spring JDBCTemplate VS Hibernate 在性能方面[关闭]
【发布时间】:2018-06-22 05:19:41
【问题描述】:

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

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

【问题讨论】:

    标签: spring hibernate jdbctemplate


    【解决方案1】:

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

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

    我想说,在 95% 的情况下,Hibernate 足够快,甚至比未优化的 JDBC 代码还要快。对于剩下的 5%,没有什么可以禁止您使用其他东西,例如 Spring-JDBC。两种解决方案并不相互排斥。

    【讨论】:

      【解决方案2】:

      这取决于您的项目以及 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 可能不会有太大帮助。

      【讨论】:

      • 所以你可以在mysql中使用spring数据?我找不到这方面的教程。
      • Spring Data 可以封装 Hibernate,Hibernate 可以使用 MySQL。那将是一种方法。但是可能还有其他框架支持 MySQL,Spring Data 也可以包装。你的问题是你从数据库开始思考。从应用开始思考;底层数据库变得不可见。
      • 我希望 Spring Data JPA 能成为我的 Hibernate 替代品,但我实际上不是粉丝。文档中的自定义界面解决方案似乎相当有限。您非常正确,如果您在运行时有许多复杂的搜索查询,Spring Data 将会非常非常痛苦。如果您不关心供应商锁定,我仍然认为好的旧 Hibernate 是最好的。
      • @egervari:Spring Data 还有其他优势,例如,您可以混合使用 Hibernate 和 NoSQL 数据源(只要您不需要连接,即)。 Spring Data 不是灵丹妙药。它只是使常见情况比 Hibernate 更简单。如果你的项目是 1% 的常见案例,那么它不适合你。如果你的项目是 99% 的常见情况,那么 Spring Data 就变得比 Hibernate 更简单。而且它不会妨碍最后 1%(与 Hibernate 不同)。
      【解决方案3】:

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

      好的一点是HibernateTransactionManager 适用于(JdbcTemplate、纯 jdbc)和休眠。

      【讨论】:

      • 缓存没有问题吗? IE。当您通过 jdbcTemplate 更改表时,如何刷新 Hibernate 缓存?你没有收到 StaleStateExceptions 吗?
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2013-08-13
        • 2012-08-04
        • 1970-01-01
        • 2011-06-02
        • 2017-02-24
        • 2012-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多