如何使用 Autofac 作为依赖项解析器在 Web API 请求中重用 Couchbase .NET SDK 连接

How to reuse Couchbase .NET SDK connection in Web API requests using Autofac as Dependency Resolver

我是 Couchbase 的新手,现在我正在努力学习重用与 Couchbase 集群和 Bucket 的连接的基础知识。

我从 Couchbase 得到一个提示,ClusterHelper 是前进的方向: https://github.com/couchbase/couchbase-net-client/blob/master/Src/Couchbase/ClusterHelper.cs

CLusterHelper 包含在我目前使用的最新 CouchbaseNetClient v.2.2.0 中。

我的 Web.Config 部分如下所示:

<couchbaseClients>
 <couchbase useSsl="false" operationLifespan="1000">
  <servers>
    <add uri="http://virdrivapp01:8091/pools"></add>
  </servers>
  <buckets>
    <add name="default" useSsl="false" password="" operationLifespan="2000">
      <connectionPool name="custom" maxSize="10" minSize="5" sendTimeout="12000"></connectionPool>
    </add>
  </buckets>
 </couchbase>
</couchbaseClients>

我可以在我的 Web Api 项目中从 Global.asax 调用 ClusterHelper.Initialize 方法,如下所示:

ClusterHelper.Initialize("couchbaseClients/couchbase");
_dataStoreClusterPointer = ClusterHelper.Get();
ClusterHelper.GetBucket("default");

变量 _dataStoreClusterPointer 只是我在 Global.asax 中用于测试的静态引用。由于我使用 Autofac,我尝试将 ClusterHelper 周围的静态包装器注册为单个实例。

我也像这样在 Web 中切换到 Autofac API:

 var builder = new ContainerBuilder();

 builder.RegisterType<DataStoreConnection>().SingleInstance();

 AutofacContainerBuilder.RegisterTypes(builder);

 builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

 var container = builder.Build();

 DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
 GlobalConfiguration.Configure(WebApiConfig.Register);
 GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);

--- 结果?

我在 Couchbase 服务器中为每个请求获得 6 个新连接。

--- 为什么它在我的 Windows 服务中工作?

这是个奇怪的问题。我也在使用 Autofac 和 Quartz.NET 来 运行 我的 Windows 服务。我使用完全相同的连接,并且在主线程的静态变量中保存指向 ClusterHelper 的指针。你猜怎么着?有用?所以无论我使用多少次连接,我都只能得到6个连接。

--- 有谁知道我做错了什么或者我需要做什么才能使用 Autofac 和 Web 重用与 Couchbase 服务器的连接 API?

好吧,在与 Couchbase 交谈后,当我在我的一个 N1QL 查询中对大型文档进行完整索引扫描时,我似乎从服务器获得了新连接。

所以我的文件大约是。 800 kB 大小,当该文档是索引扫描的一部分时,它会触发新连接打开,无论它是 .NET、Javascript、CBQ.exe 还是任何其他客户端。

因此,现在的解决方法是始终仅使用 USE KEYS 将查询范围缩小到该文档。

更多内容……