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:
- Pourquoi ne SqlConnection.Open() retour fermé les connexions dans le pool de connexions?
- Est ma solution est-elle valide?
- 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.
Vous devez vous connecter pour publier un commentaire.
J'ai fait quelques recherche similaire dans le regroupement de connexion, il y a un moment, pour une raison légèrement différente, mais nous espérons être de quelque utilité. Ce que j'ai trouvé est:
Connexions sont automatiquement retirés de la piscine, mes conclusions sont que cela, survenue quelques minutes après sa dernière utilisation. Donc, il peut être un problème de synchronisation - et ils sont en train d'être effacée, mais pas avant que les connexions sont des tentatives pour être réutilisés à nouveau.
Voici quelques articles que j'ai regardé, à la fois:
Sql Server Google Groupe
Utilisant le Regroupement de Connexion dans ASP.NET
Edit:
Il ne sembler étrange que la mauvaise connexion reste dans la piscine pour toujours - êtes-vous sûr il n'a certainement, et ce n'est pas seulement de multiples mauvaises connexions? Si vous êtes sûr, puis on dirait que les connexions ne sont pas libérée correctement dans votre code. Cette est un autre très bon article que j'ai lu il y a longtemps, qui dit (citation):
Nous avons vu le même problème à partir de C++ à l'aide de ADO. Il y A quelques années, après avoir travaillé avec le Support de Microsoft, nous avons également mis en œuvre similaire logique de nouvelle tentative dans le code et de réinitialiser la connexion de la piscine qui a résolu le problème.
Si il y a une meilleure solution que les gens de chez Microsoft, l'Appui ou l'autre ne le savait pas, ou n'étaient pas de partage (À ce moment de toute façon).