C# 使用C Mongodb驱动程序时的Mongodb性能

C# 使用C Mongodb驱动程序时的Mongodb性能,c#,mongodb,asp.net-core,C#,Mongodb,Asp.net Core,我有一个.net核心应用程序,其中我使用c和MongoDB。在应用程序中,我使用MongoDB驱动程序版本2.7进行任何与数据库相关的操作,并且我有一个MongoDB数据库版本4.0.9。我面临着一个奇怪的问题,无法找到它的根本原因。对数据库的第一个请求比后续请求花费的时间要多得多。例如,如果第一个请求需要1秒,如果我们立即发出更多请求,则需要约200-250毫秒 有人知道上述情况的解决方法吗?这不是错误。这是c驱动程序的默认行为。驱动程序仅在启动第一个操作时建立到数据库服务器的连接,并且需要几

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


有人知道上述情况的解决方法吗?

这不是错误。这是c驱动程序的默认行为。驱动程序仅在启动第一个操作时建立到数据库服务器的连接,并且需要几百毫秒才能建立连接

由于驱动程序的连接池机制,后续操作不需要建立新连接。只有在确实需要的情况下,才会建立更多的连接。如果应用程序不是多线程的,那么根据我所看到的,驱动程序通常会为整个应用程序打开大约2个连接。如果您检查您的mongodb日志文件,就会发现这一点

我的建议是,如果您正在进行任何类型的测试/基准测试,则忽略初始化连接所需的时间

更新:

如果数据库是通过网络托管的,则防火墙之类的东西可能会干扰空闲连接。如果是这种情况,您可以尝试执行以下操作,使空闲连接每分钟都得到回收/更新

MongoDefaults.MaxConnectionIdleTime=TimeSpan.FromMinutes1

如果所有其他方法都不起作用,我能想到的唯一剩下的选择就是启动一个保持活动的任务,如下所示:

        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));
                }
            });            
        }

谢谢,@Ryan的回复。我知道第一次操作需要更多的时间,但是如果我们做了多个请求,并且在该应用程序空闲20-30分钟甚至15分钟之后,如果我们真的提出请求,它又需要更多的时间,那么情况会怎样呢。我想要的是有一个一致的性能,这样我就知道应用程序是如何运行的。@BhushanShah你不是在使用mongo客户端吗?如果不是,您可以尝试将mongo客户机设置为单例/静态类并查看吗?因为mongodb池中已建立的连接只应在应用程序终止时关闭。如果已作为单例使用,请尝试将设置为较大的值。如果您想了解我如何将客户机作为单例使用,请查看我为mongodb编写的源代码。谢谢,@Ryan的回复。我只使用静态类,并且保持最大连接空闲时间为60分钟。尽管如此,如果我在上午10:05提出两个请求,然后在上午10:25提出另两个请求,第二批请求将花费更多的时间,但是如果我在上午10:06或上午10:07或上午10:08提出请求,我得到的响应相当快。我想实现的是,即使我在第一次请求30-40分钟后提出请求,我也应该能很快得到响应。有什么建议吗?@BhushanShah我在上面更新了我的答案,补充了一些建议。与Java驱动程序一样,.NET驱动程序似乎没有客户端选项将TCP套接字KeepAlive设置为true。我是从这里来的,但我也在使用C驱动程序。