【发布时间】:2018-06-22 05:19:41
【问题描述】:
在我们的项目中,我们必须在 Spring JDBCTemplate 和 Hibernate 之间做出选择。
我想知道哪个在性能以及实施和设计方面更好。以及如何?
【问题讨论】:
标签: spring hibernate jdbctemplate
在我们的项目中,我们必须在 Spring JDBCTemplate 和 Hibernate 之间做出选择。
我想知道哪个在性能以及实施和设计方面更好。以及如何?
【问题讨论】:
标签: spring hibernate jdbctemplate
如果你尽你所能使这两种实现都非常快,那么 JDBC 模板可能会快一点,因为它没有 Hibernate 的开销。但它可能需要更多的时间和代码行来实现。
Hibernate 有它的学习曲线,您必须了解幕后发生的事情、何时使用投影而不是返回实体等。但是如果您掌握了它,您将获得更多的时间,并拥有比 Hibernate 更简洁、更简洁的代码。使用基于 JDBC 的解决方案。
我想说,在 95% 的情况下,Hibernate 足够快,甚至比未优化的 JDBC 代码还要快。对于剩下的 5%,没有什么可以禁止您使用其他东西,例如 Spring-JDBC。两种解决方案并不相互排斥。
【讨论】:
这取决于您的项目以及 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 可能不会有太大帮助。
【讨论】:
在我们的项目中,我们同时使用JdbcTemplate 和Hibernate。您需要做的是在hibernate 和jdbcTemplate 之间共享DataSource。
我们可以根据操作检查两者的性能,哪个更好,我们使用更好的一个。大多数情况下,我们使用hibernate进行正常操作,如果有大查询或繁重的操作,我们会检查jdbc和hibernate的性能,以我们使用更好的为准。
好的一点是HibernateTransactionManager 适用于(JdbcTemplate、纯 jdbc)和休眠。
【讨论】:
您的数据库设计对hibernate 友好吗?如果是,那么使用休眠......如果不是,那么你可能想要避免它。 Jdbctemplate 有很多优点,并且有一些方法可以确保您的 SQL 查询易于维护。有一个包含所有这些的类或从文件中读取它们等。如果必须更新列,有一种方法可以使用标准 jdbc 获取结果集元数据,从而允许您检索列名。这可能是复杂但有趣的解决问题的方法。 Hibernate 是一个很棒的工具,但复杂的数据模型让它变得非常棘手。
【讨论】: