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

时间:2011-10-05 12:12:29

标签: asp.net sql-server-2008 connection-pooling application-pool

我在使用ASP.NET Webforms 4应用程序的codebit上遇到了问题。 我使用的是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

UPDATE: GetActiveConnexion()方法在我的情况下只执行以下代码:

Return New SqlClient.SqlConnection("my connection string obtained from the web.config file")

当我运行query2时,一切顺利,ASP.NET应用程序使用应用程序池的打开连接,我在数据集中得到结果。

但是,每当我运行query1时,在SQL服务器中打开一个新连接(我可以看到它出现在SSMS的活动监视器中),并且这个连接仍然打开。问题是,如果我运行此查询1次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);
    }
}

1 个答案:

答案 0 :(得分:1)

您的SqlCommand实例应该包含在using块中,因为它是Disposable。这可能是你问题的根源。

using (SqlClient.SqlConnection sqlConnectionToUse = GetActiveConnexion(pstrConnectString)) 
{
    using (SqlCommand sqlCmd = sqlConnectionToUse.CreateCommand())
    {
        using (SqlClient.SqlDataAdapter vAdaptor = new SqlClient.SqlDataAdapter()) 
        {
            ...
        }
    }
}

或VB

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