【发布时间】:2019-07-24 04:13:50
【问题描述】:
在 hibernate 或 OpenJPA 中,如果我这样做 FetchType.EAGER,我可能会加载不必要的数据并损害性能。
如果我执行FetchType.LAZYloading,我可能会遇到N + 1 问题。
有什么指导方针在什么时候使用什么获取模式?
【问题讨论】:
标签: lazy-loading eager-loading
在 hibernate 或 OpenJPA 中,如果我这样做 FetchType.EAGER,我可能会加载不必要的数据并损害性能。
如果我执行FetchType.LAZYloading,我可能会遇到N + 1 问题。
有什么指导方针在什么时候使用什么获取模式?
【问题讨论】:
标签: lazy-loading eager-loading
我同意@D.R. 建议的一般准则:
延迟加载一方面意味着节省内存,另一方面意味着增加对数据库的查询次数。 渴望加载是相反。
你必须选择你的毒药。
此外,我认为值得一提的是使用hibernate fetch profiles 覆盖获取策略的可能性(如果您打算使用休眠)。当预定义的惰性方法不够灵活时,它是一个很好的解决方案。 使用 fetch 配置文件,您告诉 hibernate 以“不同的方式”仅针对该事务获取对象。当您必须懒惰地获取对象时非常方便,但有时您需要不同的方法。
如果您采用二级缓存优化,则应检查兼容性,因为当前的 fetch profile 实现支持 JOIN 策略。
【讨论】:
一般来说,您应该在之后立即需要数据的所有情况下使用急切获取。如果遇到 N+1 问题,只需使用 Eager fetching 重新执行查询即可。
对于更具体的情况当然还有更多的意见,但是,我想,SO 不是讨论事情的最佳场所。
【讨论】: