Parece que é o problema comum com o pool de conexões e com muitas conexões abertas. Em seu DAL você deve ter algo assim (não importa se é mssql ou mysql):
(suponho que você esteja usando o DataReader)
/// <summary>
/// Selects a single record from the Media table.
/// </summary>
public virtual Media Select(int mediaID)
{
SqlParameter[] parameters = new SqlParameter[]
{
new SqlParameter("@MediaID", mediaID)
};
using (SqlDataReader dataReader = SqlClientUtility.ExecuteReader(connectionStringName, CommandType.StoredProcedure, "MediaSelect", parameters))
{
if (dataReader.Read())
{
return MakeMedia(dataReader);
}
else
{
return null;
}
}
}
usando garante que o SqlDataReader seja descartado corretamente. Este é apenas um exemplo básico, mas geralmente você deve ter (você pode ter) uma classe comum para todas as operações de DAL que fornecem ajudantes de conexão e que implementam IDisposable. Eu recomendo ter uma classe base da qual todas as classes DAL derivem.
Se o DAL não for o problema, eu recomendo ir mais fundo no banco de dados usando o SQL Server Profiler para avaliar execuções de consultas.
Você também pode usar o SQL Server Monitor para verificar os tempos médios de execução e as conexões não fechadas. Se o seu DAL tiver um problema, você verá muitas conexões pendentes / em espera.