ASP.NET应用程序打开方式SQL连接太多
我对ASP.NET Webforms 4应用程序的代码位有问题。 我使用的是SQL server 2008 R2,IIS 7,该网站在单独的应用程序池(集成模式,.NET4,支持32位程序集)中的Windows server 2008 R2上运行 以下代码正在引发问题:ASP.NET应用程序打开方式SQL连接太多,asp.net,sql-server-2008,connection-pooling,application-pool,Asp.net,Sql Server 2008,Connection Pooling,Application Pool,我对ASP.NET Webforms 4应用程序的代码位有问题。 我使用的是SQL server 2008 R2,IIS 7,该网站在单独的应用程序池(集成模式,.NET4,支持32位程序集)中的Windows server 2008 R2上运行 以下代码正在引发问题: Dim sqlCmd = New SqlClient.SqlCommand With sqlCmd Using sqlConnectionToUse As SqlClient.SqlConnection = GetAct
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 server中打开(我可以看到它显示在SSMS的活动监视器中),而这个连接保持打开状态。问题是,如果我运行这个查询1 100次,就会达到连接池的极限,并且会发生非常糟糕的事情。我仍然在数据集中得到结果,可以使用它们等等。。。
新连接是在调用vAdaptator.Fill()时创建的
知道怎么了吗
非常感谢您抽出时间。
(附言:很抱歉英语不好)
以下是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);
}
}
您的
SqlCommand
实例应该包装在using块中,因为它是一次性的。这可能是你问题的根源
using (SqlClient.SqlConnection sqlConnectionToUse = GetActiveConnexion(pstrConnectString))
{
using (SqlCommand sqlCmd = sqlConnectionToUse.CreateCommand())
{
using (SqlClient.SqlDataAdapter vAdaptor = new SqlClient.SqlDataAdapter())
{
...
}
}
}
或VB
连接字符串是否总是相同的?从中可以看出,query1在where子句中使用了一个测试字段,如果不存在适当的索引,可能会导致一些问题……我认为我们需要了解
GetActiveConnexion()
-是否显式打开/关闭要使用的连接?连接池取决于完全相同的连接字符串。您是否检查了查询1中的pstrConnectString变量??执行query1时,确切的pstrConnectionString是什么?我刚刚添加了GetActiveConnexion逻辑,在我的例子中非常简单。不,我没有明确地打开和关闭连接。用户可以这样做(在适配器和连接上调用dispose)以及vAdaptor.Fill(打开和关闭连接)。连接字符串总是相同的。我从web.config文件中获取它,所以我不应该更改它。我会继续检查。只是补充说,这是有效的代码更好,因为我的问题仍然存在。编辑:我的使用顺序不一样,我会再试一次。也许sqlConnectionToUse.CreateCommand()会有所帮助。上面的代码不应该导致问题,您确定您看到的连接不仅仅是连接池的结果吗?在处理SqlCommand之后,它还会增长吗?它确实有帮助。然而,我仍然有15个连接。我在这个代码块周围使用了一个同步锁(我忘了在代码段中添加这个东西),这可能是因为我还有几个线程在等待执行代码,因此保持连接打开吗?但是,Usings在syncklock内部(因此,如果锁被打开,连接就不应该被打开)。15很可能是连接池,如果它没有像您确定之前那样增长的话。只有在创建连接后锁定时,才会出现同步锁定问题。如果您只是在synclock实现中包装这段代码,那么这应该没问题(显然,您应该有一个很好的理由使用synclock)。我让代码运行了多次,15个连接是稳定的(实际上只有12个连接,其中2个是SSMS查询,一个是来自另一个应用程序的If)。但是,在我更改代码后(即在其他页面上导航,执行其他不会导致假定连接池的请求),12个连接保持活动状态。我是应该为此担心,还是应该多读一些关于MSDN连接池的文章?
Using sqlConnectionToUse As SqlClient.SqlConnection = GetActiveConnexion(pstrConnectString)
Using sqlCmd As SqlCommand = sqlConnectionToUse.CreateCommand()
Using vAdaptor As New SqlClient.SqlDataAdapter()
...
End Using
End Using
End Using