2

私はこの 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 関数で同様の手法を使用しています。何か案は?

ありがとう!

4

2 に答える 2

0

新しい接続を作成するすべての場所を確認する必要があります。投稿したログイン方法は問題ありませんUsing。想定どおりに使用されます。おそらく、使用していない他のコードが別の場所にあるUsingため、接続がリークしている可能性があります。

于 2013-06-15T18:55:22.887 に答える
-1

Web 構成設定でポーリング制限を false に設定する必要があります。

web.cofig:
<add name="ApplicationDs" connectionString="Data Source=xxx;Initial Catalog=xxx;User ID=sa;Password=xxx;pooling=false" providerName="System.Data.SqlClient"/>
于 2013-06-15T11:05:40.103 に答える