我有这个网络应用程序,我的用户在登录时似乎经常收到此错误:
“超时已过期。超时时间在获取之前已经过了 从游泳池连接。这可能是因为所有人都集中了 连接正在使用中,达到了最大池大小。 “
我的登录功能如下:
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中声明一个变量,一旦该子结束,如果我没有在其他地方使用它,那个变量和为它保留的空间就消失了。
在我的情况下,在登录函数中,因为只返回一个布尔值并且我没有将函数内部的任何变量赋值给函数外部的变量,函数中声明的所有其他变量,例如conn,da,cmd函数结束后,垃圾收集器将清除,dt等(结束函数,返回true或返回false)。由于布尔值只有一位且没有无限循环或任何东西,我看不出这个函数中是否存在内存泄漏。
我不相信它与内存泄漏有关,而是它已经耗尽SQL服务器连接。我以为我可能已经打开了许多数据库连接但没有关闭它们,但是使用“使用”块,连接将始终关闭,即使在异常情况下也是如此。
这还可能是由我的应用程序的单独实例中的其他地方的未关闭连接引起的吗?我不想粘贴我的整个应用程序,但我在其他数据库功能中使用了类似的技术。有什么想法吗?
谢谢!
答案 0 :(得分:0)
您需要查看创建新连接的所有位置。您发布的登录方法很好,它使用了Using
。可能你在其他地方有其他代码没有使用Using
从而泄漏连接。
答案 1 :(得分:-1)
您需要在网络配置设置中将轮询限制设置为false:
web.cofig:
<add name="ApplicationDs" connectionString="Data Source=xxx;Initial Catalog=xxx;User ID=sa;Password=xxx;pooling=false" providerName="System.Data.SqlClient"/>