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

问题描述 投票:0回答:1

我正在.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")

我的代码在关闭时创建了一个新集群,我在这里缺少什么?

.net vb.net couchbase
1个回答
0
投票

我不建议您这样做。 Cluster是您应该一次创建并可以在整个应用中重复使用的内容(例如单例)。我在这里看不到任何IDisposableCluster是一次性的,但包装对象不是。因此,每次创建一个新的包装器时,都有可能使包装器被垃圾回收时不处理集群连接(这对我在职业生涯中使用过的所有数据库连接都是如此,而不仅仅是Couchbase)。 >

相反,有一个ClusterHelper将为您管理群集。在启动过程中使用ClusterHelper一次,然后从此点开始使用ClusterHelper.Initialize。我建议这样做。这也具有简化包装对象的好处。

© www.soinside.com 2019 - 2024. All rights reserved.