hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size 有啥区别?

Posted

技术标签:

【中文标题】hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size 有啥区别?【英文标题】:What is the difference between hibernate.jdbc.fetch_size and hibernate.jdbc.batch_size?hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size 有什么区别? 【发布时间】:2014-02-11 00:41:25 【问题描述】:

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

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

请告诉我我的理解是否正确?还有什么是上述参数的最佳值..

【问题讨论】:

我的理解是 fetch_size 与 Collections 的延迟加载有关,而 batch_size 与批处理有关,例如批量插入或批量更新。就“最佳值”而言,我认为这是一个逐案调整的问题。 【参考方案1】:

Fetch size 用于 Statement.setFetchSize(),而 batch size 用于 Hibernate 批处理。 here 解释了这两个配置参数。对于休眠批处理,请参阅here

【讨论】:

【参考方案2】:

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

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

见this link

【讨论】:

【参考方案3】:

您的理解似乎很正确。我建议您参考有关 Hibernate 的 JBOSS 文档,下一章在 Batch processing 上。还有这个tweaking performance。

这是一个很好的、易于阅读的源代码。它提供了一些关于最佳值的建议,但正如 CodeChimp 所提到的,调整最好逐个进行,并且随着时间的推移是一个可重复的过程。

【讨论】:

【参考方案4】:

你的假设是正确的。

hibernate.jdbc.fetch_size

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

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

仅适用于 Oracle,您可能需要设置它,因为默认的 fetchSize 只是 10

hibernate.jdbc.batch_size

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

如果你设置了这个属性,你最好同时设置这两个:

hibernate.order_insertstrue hibernate.order_updatestrue

【讨论】:

“因为 Hibernate 会遍历整个 ResultSet,所以最好一次获取所有行,而不是使用多次往返。” 不一定正确。它将需要更多内存,并且在第一行可用之前需要更长的时间。根据 JDBC 驱动程序的准确提取行为,在块中提取可能会执行得更好,并且为结果集内部消耗更少的内存。 这听起来像是 JDBC Driver 的职责,即默认使用正确的获取策略,就像 SQL Server 使用自适应缓冲一样。无论如何,这个设置会覆盖默认行为,而且通常情况下,它会在 JPA 和 Hibernate 中表现得更差,至少。 当我使用 postgresql 设置获取大小时,它实际上减慢了我的数据检索速度

以上是关于hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

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

hibernate的速度问题--hibernate.jdbc.fetch_size和 hibernate.jdbc.batch_size