Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 但是,如果使用了MongoClientSettings对象,则创建多个MongoClient将不会共享相同的连接池,即使连接字符串参数(主机、端口)相同_C#_Mongodb_Sockets_Asp.net Web Api_Mongodb .net Driver - Fatal编程技术网

C# 但是,如果使用了MongoClientSettings对象,则创建多个MongoClient将不会共享相同的连接池,即使连接字符串参数(主机、端口)相同

C# 但是,如果使用了MongoClientSettings对象,则创建多个MongoClient将不会共享相同的连接池,即使连接字符串参数(主机、端口)相同,c#,mongodb,sockets,asp.net-web-api,mongodb-.net-driver,C#,Mongodb,Sockets,Asp.net Web Api,Mongodb .net Driver,MongoDB文档的字面意思可能是“连接字符串”,即仅字符串 简言之,以下工作符合预期: _client = new MongoClient("mongodb://localhost:27017"); 但不包括以下内容: MongoClientSettings clientSettings = new MongoClientSettings() { Server = new MongoServerAddress(host, port), ClusterConfigurator

MongoDB文档的字面意思可能是“连接字符串”,即仅字符串

简言之,以下工作符合预期:

_client = new MongoClient("mongodb://localhost:27017");
但不包括以下内容:

MongoClientSettings clientSettings = new MongoClientSettings()
{
    Server = new MongoServerAddress(host, port),
    ClusterConfigurator = builder =>
    {
        builder.ConfigureCluster(settings => settings.With(serverSelectionTimeout: TimeSpan.FromSeconds(serverSelectionTimeoutInSeconds)));
    }
};


_client = new MongoClient(clientSettings);

即使您使用了来自singleton的同一个MongoClientSettings对象,您仍然会得到不同的连接池。我还验证了这一点。

这正是我认为不正确的“根据文档,无论您如何创建MongoClient,因为您最终应该有两个连接池,因为您有两个不同的连接字符串。”我认为更相关的可能是您如何处理任务异步/同步MongoDB驱动程序调用。我认为它只是在太短的时间内打开了太多的套接字,而没有关闭未使用的套接字。老实说,我看了大约1小时的代码,看不出连接池在哪里被重用为具有相同连接字符串的实例。因此,每个集群最好只使用一个MongoClient实例,这是一般性的建议,无论技术如何。但csharp驱动程序文档中非常清楚地指出,具有相同的连接字符串会导致相同的池。事实上,对于一个可伸缩的应用程序来说,一路异步是非常重要的。我非常有兴趣了解所有的“机制”到套接字和任务级别。我想知道如何在这里获得更多的知识。例如,在singleton模式中,当两个调用(两个线程,同时访问同一个套接字资源,当我使用两个MongoClient时,显然会发生这种情况)时会发生什么呢。这意味着,如果您使用相同的设置创建新的MongoClient,那么它下面将使用相同的ICluster实例。MultiServerCluser和SIngleServerCluster实现了实现ICluster的集群。在您的例子中,它将是一个SingleServerCluster,它有一个IClusterableServer实例,由具有连接池的ClusterableServer实现。因此,是的,文档是正确的,对于相同的连接字符串,它是相同的连接池,这正是我认为不正确的“根据文档,无论您如何创建MongoClient,因为您最终应该有两个连接池,因为您有两个不同的连接字符串。”我认为更相关的可能是您如何处理任务异步/同步MongoDB驱动程序调用。我认为它只是在太短的时间内打开了太多的套接字,而没有关闭未使用的套接字。老实说,我看了大约1小时的代码,看不出连接池在哪里被重用为具有相同连接字符串的实例。因此,每个集群最好只使用一个MongoClient实例,这是一般性的建议,无论技术如何。但csharp驱动程序文档中非常清楚地指出,具有相同的连接字符串会导致相同的池。事实上,对于一个可伸缩的应用程序来说,一路异步是非常重要的。我非常有兴趣了解所有的“机制”到套接字和任务级别。我想知道如何在这里获得更多的知识。例如,在singleton模式中,当两个调用(两个线程,同时访问同一个套接字资源,当我使用两个MongoClient时,显然会发生这种情况)时会发生什么呢。这意味着,如果您使用相同的设置创建新的MongoClient,那么它下面将使用相同的ICluster实例。MultiServerCluser和SIngleServerCluster实现了实现ICluster的集群。在您的例子中,它将是一个SingleServerCluster,它有一个IClusterableServer实例,由具有连接池的ClusterableServer实现。是的,文档是对的,它是相同的连接池,用于相同的连接字符串。这是有意义的,因为我看到每个请求都打开了一个新的套接字。这是有意义的,因为我看到每个请求都打开了一个新的套接字。
MongoClientSettings clientSettings = new MongoClientSettings()
{
    Server = new MongoServerAddress(host, port),
    ClusterConfigurator = builder =>
    {
        builder.ConfigureCluster(settings => settings.With(serverSelectionTimeout: TimeSpan.FromSeconds(serverSelectionTimeoutInSeconds)));
    }
};


_client = new MongoClient(clientSettings);