【问题标题】:Mongodb performance in with C# mongodb driver使用 C# mongodb 驱动程序的 Mongodb 性能
【发布时间】:2019-05-13 23:59:31
【问题描述】:

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

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

【问题讨论】:

    标签: c# mongodb asp.net-core


    【解决方案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));
                    }
                });            
            }
    

    【讨论】:

    • 感谢@Ryan 的回复。我知道第一次操作需要更多时间,但是在我们执行多个请求并且在该应用程序空闲 20-30 分钟甚至 15 分钟之后,如果我们确实提出请求,它又会花费更多时间.我正在寻找的是具有一致的性能,以便我了解应用程序的行为方式。
    • @BhushanShah 你不是在重用 mongo 客户端吗?如果没有,您可以尝试使 mongo 客户端成为单例/静态类并查看吗?因为在 mongodb 池中建立的连接应该只在应用程序终止时关闭。如果已经作为单例使用,请尝试将 max connection idle time 设置为较大的值。如果您想了解我如何将客户端用作单例,请查看我为 mongodb 编写的 the wrapper library 的源代码。
    • 感谢@Ryan 的回复。我只使用静态类,并且将最大连接空闲时间保持为 60 分钟。尽管如此,如果我在上午 10:05 提出几个请求,然后在上午 10:25 提出另一个请求,第二批请求需要更多时间,但如果我在上午 10:06 或 10 点提出请求:07 AM 或 10:08 AM,我的反应很快。我想要实现的是,即使我在第一次请求后 30-40 分钟后提出请求,我也应该很快得到响应。有什么建议吗?
    • @BhushanShah 我在上面更新了我的答案并提出了更多建议。
    • .NET 驱动程序似乎没有将 TCP 套接字 KeepAlive 设置为 true 的客户端选项,就像 Java 驱动程序一样。我从stackoverflow.com/questions/35597930/… 来到这里,但我也在使用 C# 驱动程序。
    猜你喜欢
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2016-03-13
    • 2023-03-02
    • 2018-07-15
    相关资源
    最近更新 更多