无需为每个请求创建新连接的数据库访问

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 是你应该创建一次并为整个应用程序重用的东西(比如单例)。我在这里没有看到任何 IDisposableCluster 是一次性的,但您的包装器对象不是。因此,每次您创建一个新的包装器时,当您的包装器被垃圾收集时,您有可能留下一个未处理的集群连接(我在我的职业生涯中使用的所有数据库连接都是如此,顺便说一下,不仅仅是 Couchbase)。

相反,ClusterHelper 将为您管理集群。在启动期间使用一次 ClusterHelper.Initialize,然后从那时起使用 ClusterHelper.GetBucket。我建议这样做。这还有一个好处就是可以简化包装器对象。