我正在.NET(VB)中使用Couchbase,并且我试图提出一种重用我的群集连接的方法。我的班级有一个名为CouchInit()的函数,带有以下代码。
Public Class couchBase
Public cbCluster As New Cluster
Public Function couchInit() As Cluster
Try
Dim cluster As New Cluster(New ClientConfiguration With {
.Servers = New List(Of Uri) From {
New Uri(ConfigurationManager.AppSettings("couchServer").ToString())}})
Dim authenticator = New PasswordAuthenticator(ConfigurationManager.AppSettings("couchUser").ToString(), ConfigurationManager.AppSettings("couchPassword").ToString())
cluster.Authenticate(authenticator)
System.Diagnostics.Debug.WriteLine("Open Connection")
cbCluster = cluster
End If
Catch ex As Exception
System.Diagnostics.Debug.WriteLine(ex)
End Try
End Function
Public Function getDoc(ByVal docID As String)
Try
'TODO Check if Bucket is active
If (cbCluster.IsOpen(ConfigurationManager.AppSettings("couchBucket").ToString()) = False) Then
couchInit()
End If
Dim bucket = cbCluster.OpenBucket(ConfigurationManager.AppSettings("couchBucket").ToString())
System.Diagnostics.Debug.WriteLine("Open Bucket")
Dim Doc = bucket.GetDocument(Of Object)(docID)
Dim myObj As Object = Doc.Content
System.Diagnostics.Debug.WriteLine(Doc)
System.Diagnostics.Debug.WriteLine(cbCluster.IsOpen(ConfigurationManager.AppSettings("couchBucket").ToString()))
Return Doc
Catch ex As Exception
System.Diagnostics.Debug.WriteLine(ex)
End Try
End Function
End Class
到目前为止一切都很好,我可以访问我的数据库,但是每次从这样的另一个函数调用此函数
Dim couch = New couchBase
couch.getDoc("uriEndPoint::C985544D-2A31-44A0-8228-3318A56DB8E9")
我的代码在关闭时创建了一个新集群,我在这里缺少什么?
我不建议您这样做。 Cluster
是您应该一次创建并可以在整个应用中重复使用的内容(例如单例)。我在这里看不到任何IDisposable
。 Cluster
是一次性的,但包装对象不是。因此,每次创建一个新的包装器时,都有可能使包装器被垃圾回收时不处理集群连接(这对我在职业生涯中使用过的所有数据库连接都是如此,而不仅仅是Couchbase)。 >
相反,有一个ClusterHelper
将为您管理群集。在启动过程中使用ClusterHelper
一次,然后从此点开始使用ClusterHelper.Initialize
。我建议这样做。这也具有简化包装对象的好处。