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

本文关键字:请求 API Web Couchbase 连接 SDK net Autofac 依赖 | 更新日期: 2023-09-27 18:16:42

我是Couchbase的新手,现在我正在为重用到Couchbase集群和Bucket的连接的基础知识而挣扎。

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

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

我的网页。配置部分如下所示:

<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>

我可以调用ClusterHelper。从全局初始化方法。在我的Web Api项目中,如下所示:

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

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

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

 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个连接。

—有没有人知道我做错了什么,或者我需要做什么来重用连接到Couchbase服务器使用Autofac和Web API?

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

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

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

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