2

我有这个网络应用程序,我的用户在登录时似乎经常遇到这个错误:

“超时已过期。在从池中获取连接之前已经过了超时期限。这可能是因为所有池连接都在使用中并且已达到最大池大小。”

我的登录功能如下:

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),垃圾收集器将清除等。由于布尔值只有一位并且没有无限循环或任何东西,我看不出这个函数怎么会有内存泄漏。

我不认为它与内存泄漏有关,而是它正在耗尽 SQL 服务器连接。我想我可能已经打开了许多数据库连接但没有关闭它们,但是使用“使用”块,连接将始终关闭,即使在出现异常的情况下也是如此。

这也可能是由我的应用程序的单独实例中其他地方的未关闭连接引起的吗?我不想粘贴我的整个应用程序,但我在其他数据库函数中使用了类似的技术。有任何想法吗?

谢谢!

4

2 回答 2

0

您需要查看创建新连接的所有位置。您发布的登录方法很好,它Using按预期使用。可能您在其他地方有其他代码未使用Using并因此泄漏连接。

于 2013-06-15T18:55:22.887 回答
-1

您需要在 web config settings 中将 poll limit 设置为 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 回答