На сайте возникает ошибка Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.

5. Техническая поддержка > WEB > ASP, ASP.NET
описание ошибки:
 
************
Ошибка:
Server Error in '/' Application.
--------------------------------------------------------------------------------
Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 
 
********
 
решение:

В данном случае по всей видимости имеет место некорректное освобождение ресурсов базы данных, то есть соединений с базой данных. Проверьте, пожалуйста, весь свой код на наличие "висящих" соединений с базой данных, то есть таких соединений, которые принудительно не закрываются после использования.
Вот примеры подобного неправильного кода ведущего к утечке ресурсов и варианты его исправления:
1. Простой пример незакрытого соединения
 // Неправильный код
 public static int GetIntFromDataBase()
 {
       SqlConnection con = new SqlConnection(Globals.ConnectionString);
       SqlCommand com = new SqlCommand("SELECT top 1 intValue FROM table", con);
       con.Open();
       return (int) con.ExecuteScalar();
 }
 // Правильный код
 public static int GetIntFromDataBase()
 {
       try
  {
   SqlConnection con = new SqlConnection(Globals.ConnectionString);
        SqlCommand com = new SqlCommand("SELECT top 1 intValue FROM table", con);
        con.Open();
        return (int) con.ExecuteScalar();
  }
  finally
  {
   if (con!= null && con.State == ConnectionState.Open)
   {
    con.Close();
   }
  }
 }
2. Более сложная вариация, также часто имеющая место и не такая очевидная.
// Неправильный код.
// В классе работы с базой данных имеем такой код public static IDataReader GetFromDataBase() {
      SqlConnection con = new SqlConnection(Globals.ConnectionString);
      SqlCommand com = new SqlCommand("SELECT * FROM table", con);
      con.Open();
      return con.ExecuteReader(CommandBehavior.CloseConnection);
}
// В коде страницы используем полученный ридер, но не закрываем его, соответственно соединение также остается висеть открытым :( protected override void OnInit(EventArgs e) {
 IDataReader rdr = DAL.GetFromDataBase();
 while (rdr.Read())
 {
       myTextBox.Text = (string) rdr["textField"];
 }
}
// Правильный вариант использования класса SqlDataReader и ему подобных protected override void OnInit(EventArgs e) {
 IDataReader rdr = DAL.GetFromDataBase();
 while (rdr.Read())
 {
       myTextBox.Text = (string) rdr["textField"];
 }
 rdr.Close();
}
protected override void OnInit(EventArgs e) {
 IDataReader rdr = DAL.GetFromDataBase();
 try
 {
  while (rdr.Read())
  {
        myTextBox.Text = (string) rdr["textField"];
  }
 }
 finally
 {
  if (rdr != null)
  {
   rdr.Close(); 
  }
 }
}

Add Feedback