Nous avons un code client qui utilise la classe SqlConnection .NET pour parler à une base de données SQL Server. Il échoue par intermittence avec cette erreur:classe .NET SqlConnection, mise en commun de connexion et la logique de rebranchement
« ExecuteReader nécessite une connexion ouverte et disponible l'état actuel de la connexion est fermée. »
La solution « temporaire » est de redémarrer le processus, après quoi tout fonctionne - cependant, c'est évidemment insatisfaisant.
Le code maintient un cache des instances de SqlConnection, une pour chaque base de données.
Nous aimerions réécrire le code, mais avant de le faire, je dois savoir quelques choses:
Ma première question est: est-il inefficace de se connecter de façon répétée et débrancher les objets SqlConnection, ou ne la bibliothèque sous-jacente effectue le regroupement de connexions en notre nom?
// Is this bad/inefficient?
for(many-times)
{
using(SQLConnection conn = new SQLConnection(connectionString))
{
// do stuff with conn
}
}
Parce que notre code ne pas faire ce qui précède, ce qui semble la cause probable du problème est que quelque chose arrive à la base de données SQLServer sous-jacente au cours de la « vie » de la connexion qui provoque la connexion à fermer
S'il s'avère qu'il vaut la peine de "mettre en cache" des objets SqlConnection, quelle est la manière recommandée de gérer toutes les erreurs qui pourraient être résolues simplement en "se reconnectant" à la base de données. Je parle de scénarios tels que:
- La base de données est mis hors ligne et remis en ligne, mais le processus client avait pas de transactions ouvertes alors que ce qui se passait
- La base de données était « déconnecté », puis « rebranché "
Je remarque qu'il existe une propriété" State "sur SqlConnection ... existe-t-il un moyen approprié d'interroger cela?
Enfin, j'ai une instance de SQL Server de test mis en place avec les droits d'accès: comment puis-je faire pour reproduire l'erreur exacte «ExecuteReader nécessite une connexion ouverte et disponible l'état actuel de la connexion est fermée »
Ce que j'espérais entendre ... Des idées sur la façon dont je pourrais reproduire l'erreur exacte que nous voyons? (Juste pour "prouver" que j'ai résolu le problème)? –
Difficile à dire, pour être honnête. Cela pourrait facilement être une condition de concurrence, si vous essayez d'utiliser la même connexion à partir de plusieurs threads. –
Pour désactiver le regroupement de connexions: ajoutez "Pooling = False;" à la chaîne de connexion. – Richard