数据上下文注册为瞬态,但内存使用量不断增长。我的 DI 配置有问题吗?

2023-12-25

我在用着EF Core和...一起Postgres(可能并不重要)在一个.NET Core 3.1 控制台应用程序.

该程序使用一个共享项目(以及解决方案的其他组件),所有业务逻辑均使用简单的 CQRS 类型模式和 Mediator 来实现。

在一处,我从数据库中检索大小为 10 - 100MB 的大型对象。这种情况并不常见,因此本身不是问题。在现代硬件上只需几分之一秒的时间。 问题是,由于某种原因,这些对象在命令执行之间被缓存在数据上下文中,就像数据上下文没有被释放一样。

我不明白为什么,因为我将 DI 容器(内置标准)内的 DbContext 注册为瞬态。我的理解是,它应该在每次请求时创建一个新实例,而垃圾收集器应该处理其余的事情。

注册码是这样的:

static IServiceProvider ConfigureServiceProvider()
{
    IServiceCollection services = new ServiceCollection();
    
    DbContextOptions<MyAppDbContext> dbContextOptions = new DbContextOptionsBuilder<MyAppDbContext>()
       .UseNpgsql(Configuration.GetConnectionString("MyApp.Db"))
       .Options;
    services.AddSingleton(dbContextOptions);
    services.AddDbContext<MyAppDbContext>(options => options.UseNpgsql(Configuration.GetConnectionString("MyApp.Db"), options => options.EnableRetryOnFailure()), ServiceLifetime.Transient);
    services.AddTransient<IMyAppDbContext>(s => s.GetService<MyAppDbContext>());

    // (...)
}

然后命令以这种方式使用它:

public class RecalculateSomething : IRequest
{
    public Guid SomeId { get; set; }

    public class Handler : IRequestHandler<RecalculateSomething>
    {
        private IMyAppDbContext context;
        private readonly IMediator mediator;

        public Handler(IMyAppDbContext context, IMediator mediator)
        {
            this.context = context ?? throw new ArgumentNullException(nameof(context));
            this.mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
        }
        
        public async Task<Unit> Handle(RecalculateSomething request, CancellationToken ct)
        {       
            // (...)
        }
    }
}

有谁知道问题是什么?我在配置 DI 容器时做错了什么吗?或者其他东西,比如我在某处保存的参考资料(找不到)。解决此类问题的最佳方法是什么?

顺便说一句,我通过强制它每次从 DbContextOptions 创建一个新的 DbContext 来“修复它”,但这更多的是一种解决方法。想知道核心问题是什么。


您几乎永远不想注册DbContext。最好注册一个工厂,用它来创建一个新的工厂DbContext根据每一个要求。虽然这看起来效率低下,但该模式多年来一直在优化,并且允许您根据每个请求确定地回收资源。

来自文件 https://learn.microsoft.com/en-us/ef/core/dbcontext-configuration/

DbContext 的生命周期从创建实例时开始,到实例被释放时结束。 DbContext 实例设计用于单个工作单元。这意味着 DbContext 实例的生命周期通常很短。

该文档继续解释说您可以注入它,您正在这样做,但问题是这缺乏确定性的资源回收。最好使用工厂来保持这一点,对此进行了解释later https://learn.microsoft.com/en-us/ef/core/dbcontext-configuration/在同一份文件中

某些应用程序类型(例如 ASP.NET Core Blazor)使用依赖项注入,但不创建与所需 DbContext 生命周期一致的服务范围。即使确实存在这种对齐,应用程序也可能需要在此范围内执行多个工作单元。例如,单个 HTTP 请求中的多个工作单元。

在这些情况下,AddDbContextFactory 可用于注册用于创建 DbContext 实例的工厂。

我敢打赌,正是这种非确定性、查询的大尺寸和查询的频率的组合导致了应用程序中的一些内存压力。

您可以查看是否添加工厂(添加DbContextFactory https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.dependencyinjection.entityframeworkservicecollectionextensions.adddbcontextfactory?view=efcore-5.0)并使用它来创建上下文会有所帮助;再次,请参阅文档中上面引用的同一部分以获取实际代码。

如果您想知道为什么DbContext即瞬态是不确定的,您可能需要深入研究 .NET Core 代码库以查看何时回收瞬态资源。这大概就是not就在您退出处理程序之后,但在回滚(可能很深)调用堆栈之后的某个地方。

(如果是这种情况,请这样想——许多调用试图完成,因为许多调用正在展开它们的堆栈;这种短暂的情况是pressure可以在一段时间内建立)。

您的 DI 本身并没有错,但对于您想要完成的任务以及代码运行的上下文来说,它似乎并不是最佳的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据上下文注册为瞬态,但内存使用量不断增长。我的 DI 配置有问题吗? 的相关文章

  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • 私有模板函数

    我有一堂课 C h class C private template
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub

随机推荐

  • 如何在ListView的项目之间设置自定义分隔符

    有没有办法使用自定义委托作为每两个连续项目之间的分隔符ListView就像header and footer特性 A ListView可以分为sections 又名团体 该文档提供了一个很好的例子here https doc qt io q
  • Java 的国际字符

    我正在构建一个应用程序 它从 java 获取信息并构建 Excel 电子表格 一些信息包含国际字符 例如 当俄语字符在 Java 中正确呈现时 我遇到问题 但当我将这些字符发送到 Excel 时 它们无法正确呈现 我最初认为问题是编码问题
  • 使用插入单元格到表中时,UITableViewCell 不使用自动布局高度

    背景 我按照说明使用 purelayout 以编程方式创建 UITableViewCellshere https stackoverflow com a 18746930 766570 它基本上表明您必须在单元格上设置顶部 底部约束 然后使
  • 命令参数字符串未计算

    我在 aspx 页面内有一个命令参数 设置为 for 循环内的对象变量 如下所示
  • 将 Monolog WebProcessor 与 Laravel 5.6 结合使用

    我发现新的日志堆栈 通道提供了一种方法tap或定义handlers 但是 我正在努力获得WebProcessor已加载 但似乎不起作用 这个应该被挖掘吗 或者有其他方法来加载它吗 这是 Laravel 5 6 特有的 这是我在使用 Lara
  • 如何使用 JAXB 从 Java 中的 XSD 获取 minOccurs / maxOccurs 值?

    我的应用程序正在调用 Web 服务 并且我已使用 maven jaxb2 plugin 从 WSDL XSD 生成了 Java 类 Web 服务调用在一段时间内工作得很好 但最近我在将对象编组到 XML 时遇到了问题 org xml sax
  • amqp 或 xmpp 用于实时在线游戏[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 以下哪些技术套件适用于多用户在线游戏项目 项目要求 能够在任何给定时间处理 2k 5k 用户 适用于
  • CleanWPPAllFilesInSingleFolder 错误使我的项目不再加载

    我使用 VS2012 创建了一个动态数据项目 一切顺利 然后我开始配置 Web 部署设置 我不确定我到底更改了什么设置 因为没有错误 但是 当我尝试加载解决方案时 我收到该项目的以下错误 并且它将不再加载 Specified conditi
  • 为什么我会收到此 LineUnavailableException?

    我在代码的第 34 行不断收到 LineUnavailableException https www refheap com 21223 https www refheap com 21223 错误读取为javax sound sample
  • 使用 ConstraintLayout 的展开链元素组

    我在使用约束布局传播 2 组元素时遇到问题 我知道这个新布局的目标是使用平面层次结构 因此我想避免将我的元素放入子布局中 我查看了一些很棒的资源 例如constraintlayout com 但无法弄清楚如何使其适用于我的特定案例 我认为这
  • 协会类别的独特性

    我很难理解 UML 2 5 规范中解释的关联类的概念 最让我困惑的是下面这句话 摘自199页 笔记 即使当 AssociationClass 的所有末端都具有 isUnique true 时 也可能有多个实例关联末端类的同一组实例 正如这里
  • 如何能够显示没有文本的表 TD

    我的问题 如何让表格的 TD 不带有文本 而不使其消失 我使用这个 HTML 代码 div div div table cellpadding 0 cellspacing 0 border 0 tr td td td td td td tr
  • 如何在 Windows 上集成 PHP 和 R?

    集成 PHP 和 R 时遇到一些问题 我正在研究这篇文章 http www r bloggers com integrating php and r http www r bloggers com integrating php and r
  • CSS 类align-self-end 不起作用

    div class col md 3 div class card bg dark text white img class card img src http via placeholder com 300x340 alt Card im
  • Laravel proc_open():分叉失败

    我在 laravel 后出现此错误composer update 未捕获的ErrorException proc open fork失败 资源在vendor symfony console Terminal php中暂时不可用 127 pr
  • Zend 捕获布局并将内容视为变量

    我有一个控制器 My Controller 带有简单的示例操作 public function exempleAction Using layout mail this gt helper gt layout gt setLayout ma
  • 非规范化:多少才算太多?

    我已经为我正在 按书本 构建的网络应用程序设计了数据库 也就是说 我已经 创建了包含应用程序的实体 属性和关系的 E R 图 将 E R 图转换为模式 将架构转换为 无架构 形式以对数据库进行建模 该数据库是 Cassandra NoSQL
  • 使用 POST 参数压缩 HTTP 文本

    我正在编写客户端软件 该软件使用大量文本 实际上是 JSON 对象 作为 POST 参数来启动 HTTP 请求 我想在发送之前压缩此文本并在服务器上解压缩该文本 Gzip 生成二进制文件 我认为我无法将其作为 POST 参数发送 存在哪些选
  • 尝试安装 JDK8 U11 OSX 10.10 Yosemite 时出错

    今天是 Oracle JDK8 U11 的发布 当我尝试在 OSX yosemite 10 10 中安装 pkg 时 出现此错误并且无法继续 OSX版本存储在 System Library CoreServices SystemVersio
  • 数据上下文注册为瞬态,但内存使用量不断增长。我的 DI 配置有问题吗?

    我在用着EF Core和 一起Postgres 可能并不重要 在一个 NET Core 3 1 控制台应用程序 该程序使用一个共享项目 以及解决方案的其他组件 所有业务逻辑均使用简单的 CQRS 类型模式和 Mediator 来实现 在一处