【发布时间】:2023-03-23 17:14:01
【问题描述】:
我在 ASP.NET Webforms 4 应用程序的代码位上有问题。 我正在使用 SQL Server 2008 R2、IIS 7,该网站在单独的应用程序池中的 Windows Server 2008 R2 上运行(集成模式,.NET4,支持 32 位程序集)。
以下代码存在问题:
Dim sqlCmd = New SqlClient.SqlCommand
With sqlCmd
Using sqlConnectionToUse As SqlClient.SqlConnection = GetActiveConnexion(pstrConnectString), _
vAdaptor As New SqlClient.SqlDataAdapter
.Connection = sqlConnectionToUse
.CommandText = pstrSQL 'function parameter
vAdaptor.SelectCommand = sqlCmd
'query1: SELECT somecolumn FROM table WHERE somecolumn '' ==> opens a new connection in SQL Server
'query2: SELECT someothercolumn FROM anothertable WHERE someothercolumn 23 ==> uses my WebSite process active connection
vAdaptor.Fill(vDataSet)
End Using
End With
更新: GetActiveConnexion() 方法在我的例子中只执行以下代码:
Return New SqlClient.SqlConnection("my connection string obtained from the web.config file")
当我运行 query2 时,一切顺利,ASP.NET 应用程序使用应用程序池的打开连接,我在数据集中得到了我的结果。
但是,每当我运行 query1 时,都会在 SQL 服务器中打开一个新连接(我可以看到它显示在 SSMS 的活动监视器中),并且这个连接保持打开状态。问题是,如果我运行这个 query1 100 次,我会达到连接池的限制,并且会发生非常糟糕的事情。我仍然在数据集中得到结果,可以使用它们等等...... 新连接是在调用 vAdaptator.Fill() 时创建的。
有什么想法吗?
非常感谢您的宝贵时间。 (PS:抱歉英语不好)。
这里是 C# 中的代码,适合喜欢的人:
object sqlCmd = new SqlClient.SqlCommand();
using (SqlClient.SqlConnection sqlConnectionToUse = GetActiveConnexion(pstrConnectString)) {
using (SqlClient.SqlDataAdapter vAdaptor = new SqlClient.SqlDataAdapter()) {
sqlCmd.Connection = sqlConnectionToUse;
sqlCmd.CommandText = pstrSQL; //function parameter
vAdaptor.SelectCommand = sqlCmd;
//query1: SELECT F10_ID FROM FIN_MONTANT_TT_F10 WHERE F10_ID_TT_F19 = '' ==> opens a new connection in SQL Server
//query2: SELECT A48_ID FROM ADH_EPARTICIPANT_ADMIN_A48 WHERE A48_ID=23 ==> uses my WebSite process active connection
vAdaptor.Fill(vDataSet);
}
}
【问题讨论】:
-
连接字符串总是一样的吗?可以看出,query1 在 where 子句中使用了一个测试字段,如果不存在适当的索引,可能会导致一些麻烦......
-
我想我们需要看看
GetActiveConnexion()的逻辑——你是否明确地打开/关闭了要使用的连接? -
连接池依赖于完全相同的连接字符串。您是否根据 query1 检查了您的 pstrConnectString 变量?执行 query1 时的确切 pstrConnectString 是什么?
-
我刚刚添加了 GetActiveConnexion 逻辑,在我的情况下非常简单。不,我没有明确打开关闭连接。 using 这样做(在适配器和连接上调用 dispose)以及 vAdaptor.Fill(打开和关闭连接)。
-
连接字符串始终相同。我从 web.config 文件中得到它,所以我不应该改变。我会继续检查的。
标签: asp.net sql-server-2008 connection-pooling application-pool