我有一项服务,它每秒将数据发布到网络服务器(asp.net core 3.1),我使用 EF Core 3.1 存储到 sql 服务器。到目前为止,我在尝试存储新数据时分别为每个新数据行:
- 检查数据库中是否存在数据实体(实体类型
.IsUnique()
在方法中配置了索引OnModelCreating()
) - 如果不存在 - 添加单个实体
- DBContext.SaveChanges()
但是,这在 sql server 上似乎有点“重”,有很多调用。它在 Azure 上运行,有时似乎数据库出现了一些问题,并且 Web 服务器开始返回 500(据我了解,内部服务器错误)。当有人调用 web 服务器上的另一个控制器并尝试从 sql 服务器检索一些数据(更大的块)时,有时会发生这种情况。(这可能是另一个问题 - 关于 Azure SQL 服务器的可靠性)
在网络服务器上保留一个缓冲区并一次性保存所有内容是否更好,例如:DBContext.AddRange(entities)
使用更粗略的时间分辨率(即每分钟)?我不知道如果一个或多个数据重复会发生什么?那些不是重复存储的还是所有插入都被拒绝?(我似乎找不到对此的解释)。
非常感谢您对此事的任何帮助。
编辑 2021-02-08:我尝试扩展一下情况:
我无法控制:MQTT Broker(发布消息)
在我的控制下:
- MQTT 客户端(目前为 azure webjob),订阅 MQTT Broker
- ASP.NET 服务器
- SQL 数据库
MQTT 客户端正在从 mqtt 代理收集来自不同传感器的消息并将其分组为一种(或多或少)可以直接存储在数据库中的格式。
asp.net 服务器充当 mqtt 客户端和 sql 数据库之间的中间人。BUT 还向访问该网站的任何人持续发送“实时”更新。所以目前网络服务器有很多工作(也许问题出现在这里??)
- 从 MQTT 服务接收数据
- 将数据存储到数据库/从数据库中检索数据
- 为访问者提供来自 MQTT 客户端的“实时”数据以及来自数据库的历史数据
希望这有助于理解。