私はこの Web アプリを使用していますが、ログイン時にユーザーがこのエラーを受け取ることがよくあります。
「タイムアウトが発生しました。プールから接続を取得する前にタイムアウト期間が経過しました。これは、プールされたすべての接続が使用中で、最大プール サイズに達したために発生した可能性があります。」
私のログイン機能は次のとおりです。
Public Function login(userName As String, password As String) As Boolean
Dim dt As DataTable = New DataTable
Using conn As SqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("AvailDBConnection").ToString)
Dim da As SqlDataAdapter = New SqlDataAdapter
Dim cmd As SqlCommand = New SqlCommand("SELECT UserID, Password FROM [Users] WHERE UserID = @user AND Password COLLATE Latin1_General_CS_AS= @password;", conn)
cmd.Parameters.AddWithValue("@user", userName)
cmd.Parameters.AddWithValue("@password", password)
da.SelectCommand = cmd
conn.Open()
da.Fill(dt)
End Using
If dt.Rows.Count = 1 Then
Return True
Else
Return False
End If
End Function
これについてホスティングプロバイダーに手紙を書いたところ、次のように言われました。
こんにちは、
メモリリークのようです。
見直してください。
とにかくレビューしました。
私が理解しているように、データがメモリに保存され、決して破棄されない場合、メモリリークが発生します。たとえば、配列に項目を追加する無限ループがある場合、最終的にシステムはメモリ不足になります。
ただし、私が理解しているように、範囲外になると、VB.net を含む多くの言語で、不要になったデータはガベージ コレクターによって自動的に消去されます。たとえば、Sub 内で変数を宣言した場合、その Sub が終了すると、それを他の場所で使用していなければ、その変数とそのために予約されたスペースがなくなります。
私の場合、ログイン関数では、ブール値のみが返され、関数内の変数を関数外の変数に割り当てていないため、conn、da、cmd、dt、などは、関数が終了するとガベージ コレクターによってクリアされます (関数の終了、true を返す、または false を返す)。ブール値は 1 ビットのみであり、無限ループなどは存在しないため、この関数でメモリ リークが発生する可能性はありません。
メモリリークとは関係ないと思いますが、SQL サーバー接続が不足していると思われます。多くのDB接続を開いているが閉じていないのではないかと思っていましたが、「使用中」ブロックを使用すると、例外が発生した場合でも接続は常に閉じます。
これは、アプリの別のインスタンスの他の場所で接続が閉じられていないことによっても発生する可能性がありますか? アプリ全体を貼り付けたくはありませんが、他の DB 関数で同様の手法を使用しています。何か案は?
ありがとう!