Как правильно распоряжаться общими ресурсами и соединениями SQL

У меня есть сайт ASP.NET 1.1 с довольно большим трафиком. У меня есть класс в этом проекте веб-сайта, который обрабатывает все мои доступ к базе данных, называемый DBWrapper:

Public Class dbWrapper
Implements IDisposable

' the private _connVSC2000 property is used for all methods that return scalar and DataType types
Private _connVSC2000 As SqlConnection
Private _connectionString As String
Private _disposed As Boolean = False

Sub New(ByVal connectionString As String)
    _connectionString = connectionString
    _connVSC2000 = New SqlConnection(connectionString)
    _connVSC2000.Open()
End Sub

Public Overloads Sub Dispose() Implements IDisposable.Dispose
    Dispose(True)
    GC.SuppressFinalize(Me)
End Sub

Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
    If Not _disposed Then
        'If _connVSC2000.State = ConnectionState.Open Then _connVSC2000.Close()
        If disposing Then
            _connVSC2000.Dispose()
        End If
    End If
    _disposed = True
End Sub

Protected Overrides Sub finalize()
    Dispose(False)
    MyBase.Finalize()
End Sub

' Actual database access functions removed as they are not relevant to the question.
end class

У меня также есть класс (на самом деле несколько) с несколькими общими функциями, которые используют общий объект dbWrapper:

Public Class SomeClass

Private Shared dbWrapper As New dbWrapper(ConfigurationSettings.AppSettings("VSCConnectionString"))

public shared Function SomeFunction()
    'function that utilizes the shared dbWrapper object.
end Function
End Class

У меня проблема в том, что через некоторое время пул соединений заполняется, потому что соединения не освобождаются своевременно. Мои вопросы тройные:

Правильно ли реализовано удаление объекта SQLConnection в классе dbWrapper?

Как правильно реализовать удаление объекта dbWrapper в SomeClass, чтобы гарантировать, что объект dbWrapper и, следовательно, объект SQLConnection будут утилизированы правильно и не засорят пул соединений? Нужно ли явно вызывать SomeClass.Dispose, когда я закончу с ним, или он будет удален автоматически, когда выпадет из области видимости?

0 ответов

Другие вопросы по тегам