【问题标题】:How do you PRACTICALLY use lazy loading in your application?您如何在应用程序中实际使用延迟加载?
【发布时间】:2013-06-23 09:53:53
【问题描述】:

我看到很多地方专家开发人员建议延迟加载持久化实体以节省内存。

这个概念很清楚:加载大量你不会使用的信息无用

但是,根据我的日常经验,应用此最佳实践并非易事。我的意思是,如果我定义了一个依赖项,假设DEPARTMENTEMPLOYEE 之间存在一对多关系,这很可能我需要 在我的业务逻辑中处理Department 时的员工列表。 这件事很常见,我发现自己在大多数情况下都使用 EAGER 加载。

从编程的角度来看,我能做的最好的就是用这样的标志来发送我的 Dao 方法

public Department getDepartment(String departmentName, boolean eagerly)

其中eagerly 属性设置为true 会触发部门的完整加载(默认为延迟加载。我在事务中调用getEmployees() 来加载员工列表)。

你如何处理这个问题?您对 LAZY 加载感到满意吗?如果是这样,我是不是错过了什么?

编辑:

根据@Ayman 的解释,我想讨论以下使用休眠的方法。

    public class Node {
        private Node parent;
        private Set<Node> children;

        public getParent(){
            if(parent==null)
                return Hibernate.initialize(parent);
            return parent;
        }

        public getChildren(){
            if(children==null)
                return Hibernate.initialize(children);
            return children;
        }
    }

这是一个可接受的实现吗?有什么缺点?

【问题讨论】:

  • 我怀疑建议是尽可能使用延迟加载。这并不意味着延迟加载在所有情况下都有用。例如,在交易系统中,您更喜欢预先加载,而不必担心过多的内存成本。例如如今,32 GB 的成本约为 300 美元。
  • 认为如果您不使用延迟加载,则对企业列表的查询也会加载其所有部门,这将加载其所有员工的列表,这将加载...不过,决定何时需要进行预先加载取决于问题。

标签: java hibernate lazy-loading


【解决方案1】:

视情况而定。我不建议添加热切标志,因为它会暴露库的内部工作。它应该对用户透明。

我通常这样做的方式是在课堂上。该部门将有一份员工名单。读取部门时,只需读取dept表并将emp数组保留为null。然后,当您必须访问员工时,请查看列表是否已加载。应该相当容易实现,并且使库用户不知道库的内部结构。

【讨论】:

  • 我真的很喜欢你的方法,但我问自己它是否超出了休眠域的界限。我的意思是,使用您的解决方案,即使设想一种 EAGER 方法也是毫无价值的。您只需根据需要加载东西。也许我错了,但 Hibernate 不是负责处理类和持久性之间的分离吗?
  • 我根本不是指 Hibernate。只是适用于延迟加载和评估的一般性评论。如果您使用的是框架,那么一定要坚持框架的设计用途,特别是如果它是成熟的框架,例如 Hibernate。
  • 是的,你是对的。我故意假设您提到 Hibernate,因为我正在使用它! XD
  • 我想以休眠方式讨论您的解决方案。请在问题的编辑部分找到它。
猜你喜欢
  • 2011-09-10
  • 2018-10-04
  • 1970-01-01
  • 2015-01-11
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
相关资源
最近更新 更多