Доступ к базе данных без создания нового соединения для каждого запроса - PullRequest
1 голос
/ 12 марта 2020

Я использую Couchbase. NET (VB), и я пытаюсь найти способ повторно использовать мое соединение кластера. В моем классе есть функция 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")

мой код создает новый кластер, так как он закрывается, что мне здесь не хватает?

1 Ответ

1 голос
/ 13 марта 2020

Я бы не рекомендовал вам это делать. Cluster - это то, что вы должны создать один раз и повторно использовать для всего приложения (например, синглтона). Я не вижу здесь IDisposable. A Cluster одноразовый, но ваш объект-обертка - нет. Таким образом, каждый раз, когда вы создаете новую оболочку, у вас есть возможность оставить кластерное соединение нераспределенным, когда ваша оболочка собирает мусор (это справедливо для всех соединений с базой данных, которые я использовал в своей карьере, а не только Couchbase).

Вместо этого есть ClusterHelper, который будет управлять кластером для вас. Используйте ClusterHelper.Initialize один раз во время запуска, а затем ClusterHelper.GetBucket с этого момента. Я бы порекомендовал это сделать. Это также позволяет упростить ваши объекты-оболочки.

...