Приложение ASP.NET открывает слишком много SQL-соединений - PullRequest
2 голосов
/ 05 октября 2011

У меня проблема с кодовым битом в приложении 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 использует открытое соединение пула приложений, и я получаю свои результаты в наборе данных.

Однако всякий раз, когда я запускаю запрос1, на 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 Ответ

1 голос
/ 05 октября 2011

Ваш экземпляр SqlCommand должен быть заключен в блок использования, так как он одноразовый.Вероятно, это источник ваших проблем.

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
...