【问题标题】: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 与批处理有关,例如批量插入或批量更新。就“最佳值”而言,我认为这是一个逐案调整的问题。

标签: java spring hibernate jdbc orm


【解决方案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 设置获取大小时,它实际上减慢了我的数据检索速度
        猜你喜欢
        • 2015-04-29
        • 2012-02-14
        • 2010-10-02
        • 2011-12-12
        • 2010-09-16
        • 2012-03-14
        • 2012-02-06
        • 2011-02-25
        • 2011-11-22
        相关资源
        最近更新 更多