我正在编写一个包装器api来提供一个类似于的方法:
Set(string bucket, string key, object value)
我需要的是,如果提供的存储桶不可用 - 我需要使用默认存储桶,否则将其存储到特定存储桶。
我能想到的一种方法是在try ... catch块中使用提供的存储桶实例化CouchbaseClient,如果失败则将其存储在默认存储桶中。还有更好的方法吗?
答案 0 :(得分:1)
一般来说,您不希望实例化每个请求的客户端。第一次连接到群集的开销并非微不足道。因此,建议您为每个应用程序域创建一个静态实例。客户端也具有存储桶关联性,因此如果不重新安装客户端,则无法切换存储桶。
有关配置多个存储桶的信息,请参阅http://www.couchbase.com/wiki/display/couchbase/Couchbase+.NET+Client+Library。
如果您按照上面的步骤创建多个存储桶配置部分,则可以使用以下方法:
private static Dictionary<string, CouchbaseClient> _clientDict = new Dictionary<string, CouchbaseClient>();
public IStoreResult Set(string key, object value, string bucketName, string bucketPassword = "")
{
if (! _clientDict.ContainsKey(bucketName))
{
_clientDict[bucketName] = new CouchbaseClient(bucketName); //assume this matches the config section name
}
return _clientDict[bucketName].ExecuteStore(StoreMode.Set, key, value);
}
我实际上没有运行此代码,但这样的事情应该可行。记住你必须有匹配的配置部分。所以使用wiki示例,你的词典中有两个键 - “bucket-a”和“bucket-b”。
客户端的下一个版本将支持通过REST API查询存储桶,但这会影响性能。这些比特应该很快就会作为开发者预览版4。在这种情况下,您将能够添加对新CouchbaseCluster对象的ListBuckets方法的调用,并在返回列表中检查存储桶。如果该存在桶存在,则可以缓存其关联的CouchbaseClient。