ASP.NET应用程序打开方式SQL连接太多

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

我对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 = 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