C#mongodb驱动程序在Mongodb中的性能

时间:2019-05-13 23:59:32

标签: c# mongodb asp.net-core

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

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

1 个答案:

答案 0 :(得分:1)

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