gpt4 book ai didi

hibernate :batch_size?二级缓存?

转载 作者:行者123 更新时间:2023-12-02 19:08:20 24 4
gpt4 key购买 nike

我有一个 Hibernate 域对象,它由应用程序的不同部分加载。有时,延迟加载每个关联是有利的,而其他关联则最好在一个连接中加载整个事物。作为一个希望令人满意的妥协,我发现:

使用批量获取,如果访问一个代理,Hibernate 可以加载多个未初始化的代理。批量抓取是惰性选择抓取策略的优化。

hibernate.default_batch_fetch_size :

Using batch fetching, Hibernate can load several uninitialized proxies if one proxy is accessed. Batch fetching is an optimization of the lazy select fetching strategy.

我还看到:

hibernate.jdbc.fetch_size:

A non-zero value determines the JDBC fetch size (calls Statement.setFetchSize()).

Hibernate 是否足够智能,可以在批量获取时查看二级缓存?即,对关联的初始调用进行一次提取,然后接下来的 X 个调用会命中缓存吗?这样我就可以实现我想要的延迟加载,而且还可以经常访问缓存以进行更多类似批量的事务。

如果集合的全部内容已经包含在缓存中,它仍然会在访问集合时执行获取查询吗?

谢谢。

最佳答案

我今天做了很多研究,并找到了对我自己的问题的答案。我查看了 Hibernate 代码,流程如下所示:

集合是否已初始化?

  • 没有?进行批量获取(通过批量获取获取的项目放置在缓存中)
  • 是吗?在缓存中查找特定项目,如果不存在,则进行批量提取。

因此,如果在缓存中找到您要查找的集合中的项目,则不会发生批量提取。如果在二级缓存中没有找到该项目,则会进行批量提取,但无论批量项目是否在缓存中,它都会提取批量项目。

<小时/>

----- 示例 1 -----

优点:

(集合中的三项 - 批量大小为 3)第一个:

  • collection.getItem(0) - 无缓存 |批量获取3个项目
  • collection.getItem(1) - 通过批量获取加载
  • collection.getItem(2) - 通过批量获取加载

现在,在其他地方,稍后:

  • collection.getItem(0) - 缓存命中
  • collection.getItem(1) - 缓存命中
  • collection.getItem(2) - 缓存命中

----- 示例 2 -----

坏处:

(集合中的三项 - 批量大小为 3)

在这种情况下,索引 0 处的项目已从缓存中删除,因为可能缓存已满并且该项目已被删除,或者该项目已过时或空闲。

  • collection.getItem(0) - 不在缓存中,所以 Batch Of 3 (select * where id in (?, ?, ?))
  • collection.getItem(1) - 已在缓存中(无论如何都被批量获取替换)
  • collection.getItem(2) - 已在缓存中(无论如何都被批量获取替换)
<小时/>

因此,这里的权衡是,由于批处理,您的 SQL 调用会减少,但您会更频繁地丢失缓存。有一个打开的票证,可以在二级缓存中进行批处理,然后再将其发送到数据库。

http://opensource.atlassian.com/projects/hibernate/browse/HHH-1775

投票吧!

关于 hibernate :batch_size?二级缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1329555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com