default_batch_fetch_size推荐值

2024-03-21

我正在学习一些休眠教程,并陷入了default_batch_fetch_size。阅读专家评论“Hibernate 可以用于性能敏感的应用程序吗? https://stackoverflow.com/questions/651664/can-hibernate-be-used-in-performance-sensitive-applications“清楚地解释了其重要性,但我试图理解为什么链接中使用的推荐值是 4、8、16 或 32。

问候塔伦


Summary:

当启用批量获取时,Hibernate 会准备大量查询:这些查询会占用大量内存,而这些内存无法被垃圾化。批量大小为 1000 时大约需要 150 Mo 的 RAM。

因此,最好使用较低的常规批量大小(如 10、20 或 40),仅使用 @BatchSize 注释为特定集合设置更大的批量大小。

Detail:

这里解释了获取批量大小了解 Hibernate 中的 @BatchSize https://stackoverflow.com/questions/25210949/understanding-batchsize-in-hibernate,“hibernate.default_batch_fetch_size”是通用参数,“@BatchSize”注释允许覆盖特定关联上的通用参数。

但这些解释并没有真正回答“为什么官方文档推荐值 4、8 或 16”的问题?显然,现代数据库可以处理 IN 子句中包含远远超过 16 个值的查询,并且在 IN 子句中使用比方说 1000 个值进行查询将允许执行更少的查询,从而获得更好的性能...那么为什么不设置批量大小为 1000?

我做到了,我将 1024 设置为批量大小,答案很快就出现了:tomcat 服务器需要更多时间来启动,并且在调试日志中我可以看到很多带有“静态选择实体...”的行。

发生的情况是 Hibernate 准备了数千个静态查询,以下是实体的部分日志:

...
Static select for entity Profile [PESSIMISTIC_READ]: select xxx_ with (holdlock, rowlock ) where id in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Static select for entity Profile [PESSIMISTIC_READ]: select xxx_ with (holdlock, rowlock ) where id in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Static select for entity Profile [PESSIMISTIC_READ]: select xxx_ with (holdlock, rowlock ) where id in (?, ?, ?, ?, ?, ?, ?, ?, ?)
Static select for entity Profile [PESSIMISTIC_READ]: select xxx_ with (holdlock, rowlock ) where id in (?, ?, ?, ?, ?, ?, ?, ?)
Static select for entity Profile [PESSIMISTIC_READ]: select xxx_ with (holdlock, rowlock ) where id in (?, ?, ?, ?, ?, ?, ?)
Static select for entity Profile [PESSIMISTIC_READ]: select xxx_ with (holdlock, rowlock ) where id in (?, ?, ?, ?, ?, ?)
Static select for entity Profile [PESSIMISTIC_READ]: select xxx_ with (holdlock, rowlock ) where id in (?, ?, ?, ?, ?)
Static select for entity Profile [PESSIMISTIC_READ]: select xxx_ with (holdlock, rowlock ) where id in (?, ?, ?, ?)
Static select for entity Profile [PESSIMISTIC_READ]: select xxx_ with (holdlock, rowlock ) where id in (?, ?, ?)
Static select for entity Profile [PESSIMISTIC_READ]: select xxx_ with (holdlock, rowlock ) where id in (?, ?)
Static select for entity Profile [PESSIMISTIC_READ]: select xxx_ with (holdlock, rowlock ) where id = ?
...

正如您所看到的,Hibernate 准备批量获取请求,但不是为所有请求准备。 Hibernate 准备所有 1,2,3....10 个参数的请求,然后只准备参数数量等于batchSize/(2^n) 的请求。例如,如果batchSize=120 => 120, 60, 30, 15, 10, 9, 8, ..., 2, 1

所以我尝试批量获取具有不同数量元素的集合,结果是:

  • 为了获取 18 个项目,hibernate 进行了 2 次查询:一次查询 16 个项目,另一次查询 2 个项目。

  • 为了获取 16 个项目,hibernate 对 16 个项目进行了 1 次查询。

  • 为了获取 12 个项目,hibernate 进行了 2 次查询:一次查询 10 个项目,另一次查询 2 个项目。

Hibernate只使用启动时准备的语句。

之后,我监控了所有这些准备好的语句的 RAM 使用情况:

  • 与batchSize = 0 => 94 Mo(这是我的参考)

  • batchSize = 32 => 156 Mo(+62 Mo 与参考)

  • batchSize = 64 => 164 Mo(+68 Mo 与参考)

  • batchSize = 1000 => 250 Mo(+156!Mo与参考)

(我的项目规模中等,大约300个实体)

现在是时候了结论:

1) 批量大小可以有对启动时间和内存影响很大消耗。它不随批量大小线性扩展,批量大小 80 的成本是批量大小 10 的 2 倍。

2)Hibernate无法检索具有任何大小的批次的项目集合,它仅使用准备好的批次查询。如果设置batchSize = 120,则准备好的查询将是带有120、60、30、15、10、9、8、7、6、5、4、3、2和1个参数的查询。因此,如果您尝试获取包含 220 个项目的集合,则会触发 4 个查询:第一个查询将检索 120 个项目,第二个检索 60 个项目,第三个检索 30 个项目,第四个查询检索 10 个项目。

这解释了为什么推荐的批量大小较低。我建议设置一个较低的全局batchSize,例如20(对我来说20似乎比16更好,因为它不会生成比16更多的准备好的查询),并且仅在需要时设置特定的更大的@BatchSize。

(我使用的是Hibernate 5.1)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

default_batch_fetch_size推荐值 的相关文章

随机推荐

  • 确定表/数据库的字符集?

    可以运行什么 T SQL 命令来查找 SQL Server 中表或数据库的字符集 编辑 服务器版本 Microsoft SQL Server 2008 R2 RTM 10 50 1600 1 X64 您可以使用检查版本 SELECT VER
  • 如何获取span标签的值

    如何获取 span 标签的值并将其发送到我的表单中到另一个页面 span span 我需要将我的跨度标记小计的内容发送到另一个页面 我想将其保存到隐藏字段中 但我发现没有办法做到这一点 我用了这个 但没有成功 function getTot
  • 如何在 OpenglES 1.x 中实现阴影(在 iPhone 上)

    如何在我的 OpenglES 1 x 场景中实现阴影 我用谷歌搜索了几个小时 找不到任何有用的东西 我可以找到这个教程 http www paulsprojects net tutorials smt smt html 但没有成功将其移植到
  • 升级到 SDK 2.3.301 后,Service Fabric Actor 或服务随机变得无法访问

    从 Service Fabric SDK 2 0 135 升级到 2 3 301 后 我们开始遇到 Service Fabric actor 或服务无法访问的情况 尽管在 Service Fabric Explorer 中显示为正常运行 一
  • 无法获取 WorksheetFunction 类的 Match 属性

    我想做的是基于 CelloSht Input Cells Rows 7 我想在另一个Sheet的 periodSheet A列中找到匹配项 并根据给定的列获取相应的值 我尝试过结合使用 Index and Match去做这个 这 Index
  • 使用 .NET MVC 控制器操作作为 HTML 的源

    我正在尝试显示与数据库中的用户关联的图片 图片字段的数据类型是image 在页面上 不幸的是下面的代码无法做到这一点 HTML img src User Picture 1 控制器动作 public byte Picture int id
  • 字典理解中的操作顺序

    我遇到了以下有趣的构造 假设您有一个列表列表 如下所示 my list captain1 foo1 bar1 foobar1 captain2 foo2 bar2 foobar2 你想用它们创建一个字典0 index 元素是键 一个方便的方
  • React Native FlatList 列之间的分隔符

    我有一个包含多列的 FlatList
  • 如何使用自定义错误消息使概念失败 (C++20)

    概念非常适合查明代码行的错误 未满足约束条件 然而 我想知道是否可以在那里发布自定义信息消息 static assert 的优点正是这种可能性 用例 任何想要帮助用户弄清楚为什么某个表达式不满足约束的库 这是一个简单的例子 只是为了有一些代
  • 提交搜索时 ENTER 在 IE 中不起作用

    要执行全文搜索 用户只需将查询输入到简单的输入文本中 然后 一旦他们按下 ENTER 键 搜索本身就会开始 目前我们尝试这样解决 inputText 绑定到 sessionScope 变量myQuery 输入还有一个与其绑定的 OpenPa
  • 如何知道 soundpool 何时完成播放音频文件?

    我正在使用 soundpool 来播放我录制的文件 我只是想知道有什么方法可以知道 soundpool 何时完成播放 下面是我的工作代码 public void soundPool final float playbackSpeed 1 5
  • 尝试添加依赖项时出现 websocket 连接错误

    我目前正在尝试在 Electron 软件中使用 React 添加图形部分的图表 除了我添加了与按钮 部分 的交互 以根据用户对其中一个部分 变量 selectedSection 的点击在图表中插入不同的数据 所以我添加了useEffect
  • Capybara 匹配器用于确定按钮或链接的存在

    网页上的用户不区分 按钮 和 按钮样式的链接 有没有办法添加检查页面上是否存在 按钮或链接 例如水豚有步骤 page should have button Click me 它找不到按钮样式的链接 更新的答案 应该在 RSpec 3 0 中
  • 为什么我的 Spring @Autowired 字段为空?

    注意 这旨在成为常见问题的规范答案 我有一个春天 Service class MileageFeeCalculator 有一个 Autowired field rateService 但该字段是null当我尝试使用它时 日志显示 两个Mil
  • UIView drawRect 与 initWithFrame

    我有一个 UIView 其中添加了几个按钮作为子视图 目前我的按钮位于drawRect 中 我听说这是一个坏主意 因为drawRect可以被调用多次 我尝试将这些 UIButtons 移至 initWithFrame 但它们只是没有被绘制
  • Swift 2.2:不再导入 GCC_PREPROCESSOR_DEFINITIONS 常量

    The 本答案中描述的在 xcconfig 文件中分离 API 密钥的技术 https stackoverflow com a 32540064 569448不适用于 Swift 2 2由于错误 SR 909 https bugs swif
  • 如何从 C 扩展返回 Python 枚举?

    我正在为 Python 编写一个封装 C 库的 C 扩展 C 库有一些枚举类型 我已经编写了相应的IntEnums 用于这些 例如 from enum import IntEnum enum consts is a C extension
  • Breezejs EntityManager MetadataStore 和 fetchEntityByKey

    我有一个 SPA 应用程序 durandaljs 并且有一条特定的路线 可以在其中映射我想要获取的实体的 id 模板是 todoDetail id 例如 todoDetail 232 或 todoDetail 19 在 viewmodel
  • Android 中具有负半径的形状角

    我想创建一个带有角的复合视图 如下所示 这在 Android 中怎么可能呢 如果有人遇到同样的问题 最好的方法是使用 9 png 绘图 在 xml 中这是不可能的
  • default_batch_fetch_size推荐值

    我正在学习一些休眠教程 并陷入了default batch fetch size 阅读专家评论 Hibernate 可以用于性能敏感的应用程序吗 https stackoverflow com questions 651664 can hi