gpt4 book ai didi

c# - 延迟加载复杂的 RavenDb 对象

转载 作者:行者123 更新时间:2023-11-30 23:08:33 25 4
gpt4 key购买 nike

看起来我们正在处理一个考虑不周的对象设计问题,该问题现在正在表现为严重的性能/内存问题。

我们在 RavenDb 数据库中存储了数千个根聚合对象。对于某些大客户,这些对象变得太大而无法有效地执行 Web 操作(打开页面、保存数据等)。

结构如下:账户对象是聚合根在它的下面,有大量较小的对象和集合,它们的大小都“很好”,除了一个名为 Resources 的集合可以变得非常大,并可能导致根对象的大小达到数兆字节。这会导致对 Account 及其内部数据的基本 CRUD 操作执行得非常慢

Resource 集合中的对象本身并不大,但它们有自己的子对象,并且这些对象会把大小拉大。每个 Resource 对象都有 Metrics、Actions、Alerts、Scaling 等“重”的集合

我们的代码库非常复杂,有数十万行代码;数百甚至数千行代码引用资源集合并检查其中的资源对象,但访问每个资源对象的底层子集合似乎并不频繁,而且大多一次完成一个资源

问题:我们如何加载 Account 对象、它的所有子对象和对象,以及仅第一级 Resource 对象,然后延迟加载子对象-资源的 child ? (大约有 7 个特定的集合可以延迟加载)

我们有一个负责加载/保存数据的存储库

最佳答案

How do we load the Account object, all of its miscellaneous children and objects, and only the first level of Resource objects, and then lazy-load sub-children of Resources? (there are like 7 specific collections that can be lazy-loaded)

使用 Raven 进行按需加载非常简单。要做到这一点,请让您的资源拥有您想要延迟加载的东西作为它们自己的文档,然后只在父级上有一个 ID 集合。

之前:

class Resource
{
public List<Foo> Foos { get; set; }
public List<Bar> Bars { get; set; }
// ... etc
}

之后:

class Resource
{
// These are the things we need to lazy load.
public List<string> FooIds { get; set; }
public List<string> BarIds { get; set; }
}

至于您的 Foo 和 Bar 对象(Resource 的延迟加载子对象),您需要将它们存储为自己的文档。

执行此操作后,加载资源将不会加载其所有子对象,从而在读写时提高性能。

但是当你需要加载那些 child 时呢?使用。包括:

// Query for Resource and include the children in a single remote call.
var resourcesWithChildren = docSession
.Query<Resource>()
.Include(r => r.FooIds) // Include the related Foos
.Include(r => r.BarIds) // Include the related Bars
.Where(...)
.ToList();


foreach (var resource in resourcesWithChildren)
{
// Grab the children; they're already loaded, so this won't induce a remote call.
var foos = docSession.Load<Foo>(resource.FooIds);
var bars = docSession.Load<Bar>(resource.BarIds);
}

关于c# - 延迟加载复杂的 RavenDb 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46456240/

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