2014-01-27 40 views
1

我创造了这个简单的应用程序Couchbase .NET客户端被陷在构造

using System; 
using System.Configuration; 
using System.Threading; 
using Couchbase; 
using Couchbase.Configuration; 

namespace SimpleCouchClientTest 
{ 
    /// <summary> 
    /// Simple couch client test 
    /// </summary> 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var connectionString = "http://localhost:8091/pools/"; 
      var bucketName = "testbucket"; 
      var bucketPassword = "testbucket"; 
      var numberOfLoops = 1000; 

      for (var i = 0; i <= numberOfLoops; i++) 
      { 

       var config = new CouchbaseClientConfiguration 
       { 
        Bucket = bucketName, 
        BucketPassword = bucketPassword, 
       }; 

       config.Urls.Add(new Uri(connectionString)); 

       Console.WriteLine("Creating client #" + i); 
       var couchClient = new CouchbaseClient(config); 
       Console.WriteLine("Client #" + i + " created."); 
       //Thread.Sleep(100); //-- uncomment this to run successfully 
      } 
     } 
    } 
} 

numberOfLoops设置为1000,和第一个客户后CouchbaseClient创建挂起。我运行了WinDbg会话,我发现客户端卡在BucketConfigListener.Start()上。

这是一个已知的问题?有没有解决方法?

回答

0

不确定你想通过创建多个客户端实例来测试/实现什么?我认为你不应该创建如此多的Couchbase客户端。它应该是一个服务于所有应用线程的客户端实例。

您应该将“new CouchbaseClient(config);”在循环之外。

例如

var config = new CouchbaseClientConfiguration 
{ 
    Bucket = bucketName, 
    BucketPassword = bucketPassword, 
}; 
config.Urls.Add(new Uri(connectionString)); 
Console.WriteLine("Creating one client for all my app needs"); 
var couchClient = new CouchbaseClient(config); 
for (var i = 0; i <= numberOfLoops; i++) 
{ 
    // use client to do your test operations get/set/etc 
} 
+0

这只是一个复制问题的测试,我们不会在生产中创建这么多的客户端,只有3-4个客户端可以用于不同的目的。然而,他们的创作有时会陷入困境,而这个问题似乎源于构造者本身。 –

+0

你可以同步创建Couchbase客户端实例的代码块吗?所以你只有一个它的实例?例如辛格尔顿。另外检查新的即将推出的.NET客户端版本。 1.3.2:http://www.couchbase.com/issues/browse/NCBC – user1697575

+0

同步在这个循环中有帮助吗?这是一个单线程程序。即使在生产中我们也没有线程,但我们在一个循环中基于不同的配置创建不同的客户端。 –

3

我有同样的问题,最后得到了这个想通了。我正在运行fiddler2来检查Web请求/响应的内容。但是,这是干扰bucketStreaming URI的。

一旦我关闭fiddler2并确保没有其他代理到位,它工作得很好。在尝试初始化构造函数之前,我可以通过重新启动fiddler2来重现问题。

让我知道你是否也遇到过这种情况。

+0

我确实运行了Fiddler,这是一个有趣的观点。但这对我来说是一个生产问题,我们有一个独立的couchbase节点。我可能需要与管理员核对以确定该服务器上是否有其他代理。然而,这个https://www.couchbase.com/issues/browse/NCBC-152#comment-77381 –

+0

上有一个bug记录在Couchbase上,我读过这个线程,看起来AVG问题也是代理相关的 - 因为我认为AVG在机器上设置了一个Web代理来拦截和分析TCP流量。 此外,实例化客户端10,000次将极有可能使系统过载,因为它必须同时保持10,000个TCP套接字打开,并且在使用流协议时保持它们全部处于活动状态。通常在生产中,您可能只希望/需要拥有尽可能多的静态客户端,因为您有要尝试访问的存储桶。 – JebaDaHut

+0

提琴手2也把我搞砸了。从来没有想过它是一个罪魁祸首。 – Schultz9999