如何在使用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?
嗯,在与Couchbase交谈后,当我在N1QL查询中对大型文档进行完整索引扫描时,似乎我从服务器获得了新的连接。
所以我的文档大约是。800 kB大小,当该文档是索引扫描的一部分时,它会触发打开新的连接,无论它是。net, Javascript, CBQ.exe或任何其他客户端。
因此,现在的解决方法是始终只使用USE KEYS将查询范围缩小到该文档。