SQL Server pool de connexion n'est pas en mesure de détecter les connexions fermées?

Pendant des années, j'ai connu des problèmes bizarres sur toutes mes applications web qui se connectent à un serveur SQL server.

Le problème est que si quelque chose se passe pour le serveur de base de données (de redémarrer le serveur ou autre problème), de web application des arrêts de travail à partir de ce point, même si le serveur de base de données est vivant et bien par la suite.

Ce qui se passe, c'est que chaque ADO.NET opération (ExecuteNonQuery, CreateReader, BeginTransaction, ...) échoue avec un InvalidOperationException: "opération non Valide. La connexion est fermée". Il semble qu'un appel à SqlConnection.Open() récupère une connexion à partir de l'application de la piscine qui est... fermé!

Selon la documentation, le pool de connexion devrait supprimer automatiquement coupée connexions dans le pool de connexions, mais apparemment il a fermé la connexion n'est pas considéré comme "coupée", donc l'appel SqlConnection.Open() retourne joyeusement une connexion fermée, en supposant qu'il est ouvert, sans vérifier cela.

Ma solution actuelle consiste à vérifier l'état de la connexion juste après l'ouverture:

using (SqlConnection connection = new SqlConnection( connectionString ))
{
   connection.Open();

   if (connection.State != ConnectionState.Open)
   {
      SqlConnection.ClearAllPools();

      connection.Open();
   }

   // ...
}

Cette solution semble fonctionner pour l'instant, mais je ne se sentent pas à l'aise de le faire.

Donc mes questions sont:

  1. Pourquoi ne SqlConnection.Open() retour fermé les connexions dans le pool de connexions?
  2. Est ma solution est-elle valide?
  3. Est-il une meilleure façon de gérer cela?
  • J'ai trouvé que vous pouvez obtenir rompu connexions juste dans l'utilisation normale, sans SQL redémarrage. Vous vous retrouvez avec "ExecuteNonQuery nécessite une Connexion ouverte et disponible. La connexion est fermée." Je traite avec plus de 10 000 bases de données, j'ai donc toujours désactiver la connexion de la mutualisation. Il n'a jamais travaillé pour moi si j'ai plus d'une base de données.