EF Core - 添加范围 - 可能重复

问题描述

我有一个服务,每秒将数据发布到 web-server (asp.net core 3.1),我使用 EF Core 3.1 将数据存储到 sql server。 到现在为止,当我尝试存储新数据时,分别为每个新数据行:

  1. 检查数据库中是否存在数据实体(实体类型在.IsUnique()方法中配置了OnModelCreating()索引)
  2. 如果不存在 - 添加单个实体
  3. DBContext.SaveChanges()

然而,这在调用相当多的sql server上似乎有点“重”。它在 Azure 上运行,有时似乎数据库有一些问题,并且网络服务器开始返回 500(据我所知,内部服务器错误)。当有人调用 web 服务器上的另一个控制器并尝试从 sql 服务器检索一些数据(更大的块)时,有时会发生这种情况。 (这可能是另一个问题——关于 Azure sql 服务器的可靠性)

在网络服务器上保留一个缓冲区并一次性保存所有内容是否更好,例如:DBContext.AddRange(entities) 具有更粗略的时间分辨率(即每分钟)?我不知道如果一个或多个数据重复会发生什么?那些不是重复存储的还是所有插入都被拒绝? (我似乎找不到对此的解释)。

非常感谢您对此事的任何帮助。

编辑 2021-02-08: 我试着扩展一下情况:

超出我的控制范围:MQTT broker(发布消息)


在我的控制之下:


MQTT 客户端正在收集来自 mqtt 代理的不同传感器的消息并将其分组为可以(或多或少)直接存储在数据库中的格式。

asp.net 服务器充当 mqtt 客户端和 sql 数据库间的中间人。但也不断向访问该网站的任何人发送“实时”更新。所以目前网络服务器有很多工作(也许问题出在这里??)

  • 从 MQTT 服务接收数据
  • 数据库中存储/检索数据
  • 为访问者提供来自 MQTT 客户端的“实时”数据以及来自数据库的历史数据

希望这有助于理解。

解决方法

我最终得到了一个带有 ConcurrentDictionary 的缓冲服务,我在我的 asp.net 控制器中使用了它。这样我就可以确保以受控方式在我的代码中处理重复项(根据接收到的数据的质量更新现有的或丢弃的)。每分钟我都会将最后几分钟的数据清空到数据库中,以便我始终保留一分钟的数据。额外奖励:我还可以通过缓冲服务更快地向访问者提供当前数据,而不是转到数据库。