Spring JDBCTemplate VS Hibernate在性能方面

Amr*_*uta 41 spring hibernate jdbctemplate

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

我想知道哪个在性能,实现和设计方面更好.如何?

JB *_*zet 50

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

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

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


Aar*_*lla 37

这取决于您的项目以及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)
Run Code Online (Sandbox Code Playgroud)

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

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

其中一个关键特性是DAO 实现如下所示:

public interface UserRepository extends Repository<User, Long> {

  List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • Spring Data可以包装Hibernate,而Hibernate可以使用MySQL.这将是一种方法.但也有可能是它支持MySQL引擎盖下的其他框架和Spring的数据也可以换.你的问题是你从数据库开始思考.从应用程序开始思考; 底层数据库变得不可见. (2认同)
  • @egervari:Spring Data 还有其他优点,例如,您可以混合 Hibernate 和 NoSQL 数据源(只要您不需要联接)。Spring Data 并不是灵丹妙药。它只是使常见情况比 Hibernate 更简单。如果你的项目是 1% 的常见情况,那么它不适合你。如果你的项目99%都是通用情况,Spring Data就变得比Hibernate更简单。而且它不会妨碍最后 1%(与 Hibernate 不同)。 (2认同)

Nan*_*ale 15

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

好处是HibernateTransactionManager适用于(JdbcTemplate,普通jdbc)和hibernate.

  • 你不会遇到缓存问题吗?即当你通过jdbcTemplate更改表时,如何刷新Hibernate缓存?你不是得到StaleStateExceptions吗? (2认同)