hibernate.jdbc.fetch_size和hibernate.jdbc.batch_size有什么区别?

问题描述 投票:11回答:4

我正在尝试调整我的应用程序,遇到了一些关于批量提取和批量选择的博客,并将我的理解如下。

  • hibernate.jdbc.fetch_size - 用于指定选择查询中要提取的行数。
  • hibernate.jdbc.batch_size - 用于指定在单个数据库命中中执行的插入或更新的数量。

请告诉我我的理解是否正确?以上参数的最佳值是多少?

java spring hibernate jdbc orm
4个回答
14
投票

这两个选项都在JDBC驱动程序中设置属性。在第一种情况下,hibernate.jdbc.fetch_size在JDBC驱动程序中设置语句的提取大小,即select语句上有多行结果时获取的行数。

在第二种情况下,hibernate.jdbc.batch_size确定一次发送到数据库以供执行的更新(插入,更新和删除)的数量。此参数是进行批量插入所必需的,但必须与有序的inserts参数和JDBC驱动程序将插入重写为批量插入语句的功能相结合。

this link


4
投票

你的假设是正确的。

hibernate.jdbc.fetch_size

hibernate.jdbc.fetch_size Hibernate配置属性用于为Hibernate在当前运行的持久性上下文中使用的每个语句设置JDBC Statement#setFetchSize属性。

通常,您不需要设置此属性,因为默认值很好,特别是对于MySQL和PostgreSQL,它在单个数据库往返中获取整个ResultSet。因为Hibernate遍历整个ResultSet,所以最好在单次拍摄中获取所有行,而不是使用多次往返。

仅限Oracle,您可能需要设置它,因为默认的提取大小只有10.有关更多详细信息,请查看this article

hibernate.jdbc.batch_size

hibernate.jdbc.batch_size属性用于将多个INSERT <UPDATE和DELETE语句一起批处理,以便可以在单个数据库调用中设置它们。

如果你设置了这个属性,你最好还是选择这两个:

  • hibernate.order_insertstrue
  • hibernate.order_updatestrue

有关详细信息,请查看以下两篇文章:


0
投票

当批量大小用于Hibernate批处理时,获取大小确实是Statement.setFetchSize()。两个配置参数都解释为here。对于hibernate批处理,请参阅here


0
投票

你的理解似乎很正确。我会把你推荐给关于Hibernate的JBOSS文档,下一章是关于Batch processing的。这一个在tweaking performance

这是一个好的,易于阅读的来源。它提供了一些关于最佳值的建议,但正如CodeChimp所提到的,调优最好是逐个进行,并且是一个可重复的过程。

© www.soinside.com 2019 - 2024. All rights reserved.