Как решить проблему пула соединений между ASP.NET и SQL Server? - PullRequest
171 голосов
/ 22 марта 2009

Последние несколько дней мы видим это сообщение об ошибке на нашем сайте слишком много:

"Время ожидания истекло. Время ожидания истекший до получения подключение из бассейна. Это может произошло, потому что все объединено соединения использовались и максимальный пул размер достигнут. "

Мы ничего не изменили в нашем коде в течение некоторого времени. Я пересмотрел код, чтобы проверить открытые соединения, которые не закрывались, но нашли все в порядке.

  • Как я могу решить эту проблему?

  • Нужно ли редактировать этот пул?

  • Как мне отредактировать максимальное количество соединений в этом пуле?

  • Какое рекомендуемое значение для сайта с высоким трафиком?


Обновление:

Нужно ли что-то редактировать в IIS?

Обновление:

Я обнаружил, что число активных подключений составляет от 15 до 31, и обнаружил, что максимально допустимое количество подключений, настроенных на сервере SQL, превышает 3200, слишком много - 31, или я должен что-то редактировать в ASP Конфигурация .NET?

Ответы [ 19 ]

2 голосов
/ 21 февраля 2013

Если вы работаете со сложным унаследованным кодом, где простое использование (..) {..} невозможно, как я, возможно, вы захотите проверить фрагмент кода, который я разместил в этом ТАКОМ вопросе. для способа определения стека вызовов при создании соединения, когда соединение потенциально утечка (не закрывается после установленного времени ожидания). Это позволяет довольно легко определить причину утечек.

2 голосов
/ 31 мая 2018

В дополнение к опубликованным решениям ....

Имея дело с 1000 страницами устаревшего кода, каждый из которых вызывает общий GetRS несколько раз, вот еще один способ решить эту проблему:

В существующей общей DLL мы добавили параметр CommandBehavior.CloseConnection :

    static public IDataReader GetRS(String Sql)
    {
        SqlConnection dbconn = new SqlConnection(DB.GetDBConn());
        dbconn.Open();
        SqlCommand cmd = new SqlCommand(Sql, dbconn);
        return cmd.ExecuteReader(CommandBehavior.CloseConnection);   
    }

Затем на каждой странице, пока вы закрываете устройство чтения данных, соединение также автоматически закрывается, поэтому утечки соединения предотвращаются.

    IDataReader rs = CommonDLL.GetRS("select * from table");
    while (rs.Read())
    {
        // do something
    }
    rs.Close();   // this also closes the connection
2 голосов
/ 13 июня 2016

Не создавайте sql-соединение слишком много раз. Откройте одно или два соединения и используйте их для всех последующих операций sql.

Кажется, что даже при Dispose подключении возникает исключение.

2 голосов
/ 20 июля 2014

Используйте это:

finally
{
    connection.Close();
    connection.Dispose();
    SqlConnection.ClearPool();
}
1 голос
/ 18 февраля 2019

У меня была такая же проблема, и я хотел поделиться тем, что помогло мне найти источник: Добавьте имя приложения в строку подключения, а затем проконтролируйте открытое подключение к SQL Server

select st.text,
    es.*, 
    ec.*
from sys.dm_exec_sessions as es
    inner join sys.dm_exec_connections as ec on es.session_id = ec.session_id
    cross apply sys.dm_exec_sql_text(ec.most_recent_sql_handle) st
where es.program_name = '<your app name here>'
1 голос
/ 18 ноября 2017

Эта проблема у меня была в моем коде. Я вставлю пример кода, который я перешел ниже ошибки. Период ожидания истек до получения соединения из пула. Это могло произойти из-за того, что все пул соединений использовался и был достигнут максимальный размер пула.

 String query = "insert into STATION2(ID,CITY,STATE,LAT_N,LONG_W) values('" + a1 + "','" + b1 + "','" + c1 + "','" + d1 + "','" + f1 + "')";
    //,'" + d1 + "','" + f1 + "','" + g1 + "'

    SqlConnection con = new SqlConnection(mycon);
    con.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = query;
    cmd.Connection = con;
    cmd.ExecuteNonQuery();
    **con.Close();**

Вы хотите закрыть соединение каждый раз. До этого я не использовал тесную связь из-за этого я получил ошибку. После добавления оператора close у меня вышла эта ошибка

0 голосов
/ 14 декабря 2018

В моем случае у меня был бесконечный цикл (из свойства get, пытающегося получить значение из базы данных), который продолжал открывать сотни соединений Sql.

while (true)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        someCall(connection);
    }
}
0 голосов
/ 05 октября 2017

С этой проблемой я сталкивался раньше. В итоге возникла проблема с брандмауэром. Я просто добавил правило в брандмауэр. Мне пришлось открыть порт 1433, чтобы сервер SQL мог подключиться к серверу.

0 голосов
/ 15 августа 2016

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

 Using (SqlConnection sqlconnection1 = new SqlConnection(“Server=.\\SQLEXPRESS ;Integrated security=sspi;connection timeout=5”)) {
                          sqlconnection1.Open();
                          SqlCommand sqlcommand1 = sqlconnection1.CreateCommand();
                          sqlcommand1.CommandText = “raiserror (‘This is a fake exception’, 17,1)”;
                          sqlcommand1.ExecuteNonQuery();  //this throws a SqlException every time it is called.
                          sqlconnection1.Close(); //Still never gets called.
              } // Here sqlconnection1.Dispose is _guaranteed_

https://blogs.msdn.microsoft.com/angelsb/2004/08/25/connection-pooling-and-the-timeout-expired-exception-faq/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...