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