首页 > 解决方案 > 使用 C# mongodb 驱动程序的 Mongodb 性能

问题描述

我有一个使用 c# 和 MongoDB 的 .net 核心应用程序。在应用程序中,我使用 MongoDB 驱动程序(2.7 版)进行任何与数据库相关的操作,并且我有一个 MongoDB 数据库(4.0.9 版)。我面临一个奇怪的问题,无法找出根本原因。对数据库的第一个请求比后续请求花费的时间要多得多。例如,如果第一个请求需要 1 秒,如果我们立即发出更多请求,则需要大约 200-250 毫秒

有谁知道上述情况的解决方案?

标签: c#mongodbasp.net-core

解决方案


这不是错误。这是 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));
                }
            });            
        }

推荐阅读