c# - 使用 C# mongodb 驱动程序的 Mongodb 性能
问题描述
我有一个使用 c# 和 MongoDB 的 .net 核心应用程序。在应用程序中,我使用 MongoDB 驱动程序(2.7 版)进行任何与数据库相关的操作,并且我有一个 MongoDB 数据库(4.0.9 版)。我面临一个奇怪的问题,无法找出根本原因。对数据库的第一个请求比后续请求花费的时间要多得多。例如,如果第一个请求需要 1 秒,如果我们立即发出更多请求,则需要大约 200-250 毫秒
有谁知道上述情况的解决方案?
解决方案
这不是错误。这是 c# 驱动程序的默认行为。驱动程序仅在启动第一个操作时才建立与数据库服务器的连接,建立连接需要几百毫秒。
由于驱动程序的连接池机制,后续操作不需要建立新的连接。只有在真正需要时才会建立更多的连接。如果应用程序不是多线程的,那么驱动程序通常会为整个应用程序打开大约 2 个连接,据我所知。如果你检查你的 mongodb 日志文件,它会很明显。
如果您正在进行任何类型的测试/基准测试,我的建议是忽略初始化连接所需的时间。
更新:
如果您的数据库托管在网络上,则防火墙之类的东西可能会干扰空闲连接。如果是这种情况,您可以尝试执行以下操作,以便每分钟回收/更新空闲连接。
MongoDefaults.MaxConnectionIdleTime = TimeSpan.FromMinutes(1)
如果所有其他方法都不起作用,我能想到的唯一剩下的选择是启动一个保持活动状态的任务,如下所示:
public void InitKeepAlive()
{
Task.Run(async () =>
{
while (true)
{
await client.GetCollection<Document>("Documents")
.AsQueryable()
.Select(d => d.Id)
.FirstOrDefaultAsync();
await Task.Delay(TimeSpan.FromMinutes(1));
}
});
}
推荐阅读
- c# - 为什么我的 OnSelectedIndexChanged 没有触发?
- gcc - GCC 中 -x 标志的输入和输出“语言”是什么意思?
- python - Flask 上的 Keras 有状态 LSTM 推理
- apache-kafka - KSQL 流返回不正确的纪元转换
- java - joda-time ISODateTimeFormat.dateTime() 行为不端
- c - 仅允许使用字母、连字符和撇号的功能
- c++ - 二叉搜索树复制构造函数 | C++
- java - 将文件读入多个对象的arraylist java
- php - 如何修复未定义索引 PHP 错误消息,该错误消息可以正常工作,但在没有用户登录时出错?
- excel - 需要创建目标范围不在固定位置的数组公式