从长远来看,使用fetch jetch查询是否会提升性能?
假设我想从DB中读取100个对象,这些对象中的每一个都具有包含两个附加对象的一对多关系。这些附加对象将经常被阅读。获取这些对象的查询可以通过两种方式进行:
1) SELECT o FROM Object o
2) SELECT o FROM Object o FETCH o.relationObjects
我意识到获取关系对象会立即加载它们而不是懒惰,这样做的好处是只对数据库进行一次查询而不是数百次。
问题就出现了:假设程序已经运行了一天,实体管理器已经缓存了所有对象及其关系(总共300个)。我想再次列出对象,以及它们的关系对象。查询2现在会给我任何性能优势吗?在第一次缓存后它是否可以用于任何目的?
编辑:我正在使用EclipseLink
答案 0 :(得分:1)
谈到缓存一般而言,而不是JPA特定的,我会认为我们获胜的场景是我们没有获得缓存命中。我的期望是,缓存最常见的是远小于数据库的大小,在这种情况下,减少查询的数量可能非常重要。
JPA标准规定了一级缓存:实体管理器缓存,这是一个相对较短的持续时间缓存,在正常使用中,它持续一个事务的生命周期。因此,您所询问的情况并不真正适用,我们没有逐渐填充缓存 - 它的寿命太短,因此热切加载的好处可能非常显着。
另请注意,JPA实施者可以添加第二级缓存,有时也称为L2或"共享"缓存。这个article描述了这一点。存在缓存过期规则,并且实现者还可以提供API来控制刷新该缓存,例如this article描述了一个这样的API。