トラフィックがかなり多い 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 を明示的に呼び出す必要がありますか?それとも、範囲外になったときに自動的に破棄されますか?