问题标签 [lazy-loading]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1284 浏览

apache-flex - 延迟加载何时会成为 RIA 中的问题?

所以我有一个使用 Spring MVC + Hibernate 的简单 Web 应用程序,并且正在使用 OpenSessionInViewFilter。我最近一直在考虑用 Flex 或 GWT 之类的东西替换 UI。

起初我认为这很容易,因为我可以从新的前端访问我的服务层。但是当我更多地考虑这一点时,我对延迟加载的问题有点紧张。使用传统的 Web 前端没问题,因为我在视图中使用了开放会话......视图需要加载的所有内容都会在视图构建时加载。

所以假设我有一个方法来返回一个客户,一个客户有一堆联系人,联系人有一堆地址,等等。如果我从我的新“RIA”控制器调用 getCustomer(),它将获得一个客户,但客户的联系人集合只是一个代理或 null。

我可以在已有的基础上创建一个新层,返回预先填充的 DTO……但是……这似乎会变得复杂。

有什么建议吗?

0 投票
2 回答
4324 浏览

hibernate - 如何通过 hql 延迟加载一对一的组合

如果实体 A 与实体 B 具有双向一对一或零对一映射。

映射如下:

当我为 EntityA 执行 hql 查询(或者更确切地说是命名的 hql 查询)时,hibernate 会急切地使用单独的 select 语句加载 EntityA#propertyB。

我的问题是,如果我的 hql 返回 1000 个 EntityA(都有各自的 EntityB),hibernate 将执行 n+1 个查询(第一个查询是 EntityA 返回 1000 个结果,而 n 个查询将来自 EntityA# propertyB 选择延迟加载)。

但是,我不需要那些 EntityA#propertyB,这就是为什么我想延迟加载它们(不让休眠使用单独的 sql 查询)。

那可能吗?如果是,我该怎么做?

谢谢,弗兰兹

0 投票
5 回答
17101 浏览

java - Java JDBC 延迟加载的结果集

有没有办法让你通过运行 JDBC 查询获得的 ResultSet 被延迟加载?我希望在我请求时而不是事先加载每一行。

0 投票
2 回答
138 浏览

.net - 找到正确的模式来加载具有不同图形的对象

我试图找出处理加载具有不同图形(相关实体)的对象的最佳方法,具体取决于它们所使用的上下文。

例如这是我的域对象的示例:

我想了解的是如何根据我的使用方式以不同的方式加载这些信息。

例如,在首页我有一个所有谜题的列表。在这一点上,我并不真正关心谜题的解决方案或这些解决方案中的步骤(可能会变得非常庞大)。我想要的只是谜题。我会像这样从我的控制器加载它们:

稍后对于拼图视图,我现在只关心当前用户的解决方案。我不想用所有解决方案和所有步骤加载整个图表。

在我的 IPuzzleService 中,我的方法如下所示:

延迟加载在现实世界中实际上并不奏效,因为我的会话是在每个工作单元之后立即处理的。我的控制器没有存储库的任何概念,因此不管理会话状态,并且在呈现视图之前无法保持它。

我试图找出在这里使用的正确模式是什么。我的服务是否有不同的重载,比如和GetPuzzleWithSolutionsAndVotes更多视图特定的?GetPuzzlesForDisplayViewGetPuzzlesForListView

我说得有道理吗?我离基地很远吗?请帮忙。

0 投票
2 回答
5301 浏览

c# - NHibernate 会话管理和延迟加载

我有一段时间试图找出我在 NHibernate 中的会话管理问题。我假设我的很多麻烦是由于缺乏对 IoC 和 AOP 概念的了解;至少我是这么想的,法比奥·毛洛一直在指导我。

无论如何,我的问题是我有一个 win 表单应用程序,它正在进行“get”调用并将结果绑定到网格。绑定后,用户可能会执行某种“写入”操作,这些操作会导致会话在写入后关闭,以尝试使用会话每次使用的概念。然后用户可以滚动浏览导致延迟加载启动的网格,现在会话已经关闭,我得到一个异常。

我不想让我的视图认识到我的会话,我不想在用户关闭表单时发送 KillAllSessions。此外,用户可能在任何给定时间打开多个表单,这进一步加剧了与该方法相关的问题。我基本上希望所有这些都在“幕后”工作。

所以到目前为止我的想法是拦截延迟加载调用并检查会话是否打开,如果没有重新打开它,获取信息然后重新关闭它。但是,据我所知,这并不多,这基本上就是延迟加载的工作原理。它被代理工厂 (NHibernate.Bytecode.Castle) 拦截,然后使用会话检索数据。所以我需要实际拦截该调用,然后在重新打开会话后将其传递给最初的预期拦截。这就是我的想法。

我的问题基本上首先是这甚至是正确的方法吗?其次,如果是我什至不知道从哪里开始。我从来没有做过任何方法调用的拦截,我在理论上知道但在实践中不知道。我知道有一些图书馆可以做这种事情,比如 Rhino Commons,但我想借此机会学习并成为一名更好的程序员。我正在尝试理解 AOP 和上下文绑定对象,但目前我并没有理解它。你们中的一些人可以帮助一个人吗?

0 投票
2 回答
1333 浏览

nhibernate - 当实体上存在惰性属性时,NHibernate 的 criteria.List() 挂起

我遇到了一些非常奇怪的行为,NHibernate 查询开始挂起。我制作了一个演示项目,以可重复的方式展示了这种行为。

你可以在这里下载项目

这是有问题的代码:

关键行是作者字段上的 .SetFetchMode。在我的演示项目的第一次加载时,它加载良好。当我点击刷新时,它挂起并且永远不会超过 crit.List() 调用。通过急切的加载,它每次都能正常工作。

我正在使用 Castle.Facilities.NHibernateIntegration.Components.SessionWebModule 来确保每个请求 1 个会话。

我发现的另一件奇怪的事情是这只发生在 SQL Server 上。当我使用 SQLite 时,一切正常。在我的演示项目中,我有一个简单的构建标志,可让您轻松切换数据库。只需查看 /build 目录中的 local.properties.xml。

我知道在这种特殊情况下急切加载解决了我的问题,但在我的应用程序中,我不想急切加载所有内容。

请下载解决方案并自己尝试。我在其他机器上试过,他们做同样的事情。

以下是一些 SQL Profiler 捕获。您可以看到 Posts 的查询已发送到服务器,但它停在那里:

第一个请求(按预期运行):

好的请求 http://muc-central.com/misc/good_request.jpg

第二个请求(挂起):

替代文字 http://muc-central.com/misc/hanging_request.jpg

0 投票
1 回答
197 浏览

c# - 持久化延迟加载的属性

我正在使用一个简单的存储库模式并拥有带有 LazyList 的对象,例如:

这对于获取物品非常有用,但我想知道通常如何保存物品?

为了坚持促销,我只需要保存 TargetSites 列表,前提是它们首先被加载。这是延迟加载项目的常见模式吗?我可以找到很多关于延迟加载的信息,但很少能找到对延迟加载对象的结果修改。

0 投票
1 回答
157 浏览

.net - 我可以告诉 VS2008 忽略我延迟加载的属性的调试时评估吗?

在我们的 .Net 应用程序中,我们的一些业务对象使用延迟加载来访问来自服务器的数据。在调试时,如果我想检查一个属性,我必须非常小心,而不是“查看”或访问这些属性,因为这会导致 IDE 尝试评估这些属性,但会失败。是否有一个属性我可以放在这些属性上,这样它们仍然会显示在 Intellisense 中,但在调试期间检查对象时不会被评估?

0 投票
3 回答
13189 浏览

java - 会话关闭后,如何使用休眠访问延迟加载的字段?

考虑这种情况:

  • 我已经通过休眠加载了一个父实体
  • Parent 包含一个很大且延迟加载的 Children 集合
  • 在用户查看父数据时,在此初始加载后关闭休眠会话
  • 用户可以选择查看lazy Children集合的内容
  • 我现在希望加载该集合

加载此集合的方式/最佳方式是什么?

  • 假设 session-in-view 不是一个选项,因为只有在用户查看了 Parent 并决定查看 Children 之后才会获取 Children 集合。
  • 这是一项服务,可通过基于 Web 和桌面的客户端远程访问。

谢谢。

0 投票
1 回答
1489 浏览

entity-framework - 实体框架:延迟加载“解决方案”的问题(不询问如何进行延迟加载)

所以基本上我想出了一个半自制的延迟加载解决方案,基本上让生成的属性是私有的,并且有一个公共属性来处理是否加载生成的属性:

现在,这适用于类中的查询(因为我在生成的类的部分类扩展中拥有所有“查询”),例如:

由于此方法位于 Item 类中,因此它可以在无法执行的情况下正常运行:

由于实体框架无法弄清楚该代理属性是什么来生成表达式。这确实成为一个问题,假设我正在尝试计算一个房间的所有帖子(项目),并且我希望在 Room 类上使用该方法。

出于同样的原因,在 Item 类中,我不能在 Item 类中使用 ParentRoom(代理)属性,我不能在此查询中对 Room 类使用它。实体框架只是无法弄清楚该属性。

现在的问题是,是否有某种属性我可以标记 ParentRoom 属性,以便它知道它是指 ParentRoomInner 属性,因此可以知道在分解表达式时如何处理它?

我能想到的唯一其他选择是让生成的属性是内部的,让 Room 类查询使用 ParentRoomInner 属性(meh)或将 GetPostCount 方法等方法移动到 Item 类,并且只在 Room 类点上使用 GetPostCount 方法给它。(也不可怕,只是加倍了一种方法)