0

トラフィックがかなり多い ASP.NET 1.1 Web サイトがあります。この Web サイト プロジェクトには、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

私が抱えている問題は、接続がタイムリーに解放されていないため、しばらくすると接続プールがいっぱいになることです。私の質問は 3 つあります。

dbWrapper クラスの SQLConnection オブジェクトの破棄は正しく実装されていますか?

「SomeClass」で dbWrapper オブジェクトの破棄を実装して、dbWrapper オブジェクト、したがって SQLConnection オブジェクトが適切に破棄され、接続プールを詰まらせないようにする正しい方法は何ですか? 終了したら SomeClass.Dispose を明示的に呼び出す必要がありますか?それとも、範囲外になったときに自動的に破棄されますか?

4

0 に答える 0