无需为每个请求创建新连接的数据库访问
Database Access without creating new connection for every request
我在 .NET (VB) 中使用 Couchbase,我正在尝试想出一种方法来重用我的集群连接。我的 class 有一个名为 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.Initialize
,然后从那时起使用 ClusterHelper.GetBucket
。我建议这样做。这还有一个好处就是可以简化包装器对象。
我在 .NET (VB) 中使用 Couchbase,我正在尝试想出一种方法来重用我的集群连接。我的 class 有一个名为 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.Initialize
,然后从那时起使用 ClusterHelper.GetBucket
。我建议这样做。这还有一个好处就是可以简化包装器对象。