J'ai ma logique métier implémentée dans des classes statiques simples avec des méthodes statiques. Chacune de ces méthodes ouvre / ferme la connexion SQL lorsqu'elle est appelée:
public static void DoSomething(string something)
{
using (SqlConnection connection = new SqlConnection("..."))
{
connection.Open();
// ...
connection.Close();
}
}
Mais je pense qu'éviter d'ouvrir et de fermer une connexion économise les performances . J'ai fait quelques tests il y a très longtemps avec la classe OleDbConnection ( je ne suis pas sûr de SqlConnection), et cela a vraiment aidé à fonctionner comme ça (pour autant que je me souvienne):
//pass the connection object into the method
public static void DoSomething(string something, SqlConnection connection)
{
bool openConn = (connection.State == ConnectionState.Open);
if (!openConn)
{
connection.Open();
}
// ....
if (openConn)
{
connection.Close();
}
}
La question est donc: dois-je choisir la méthode (a) ou la méthode (b)? J'ai lu sur une autre question de stackoverflow que le pool de connexions a économisé les performances pour moi, je n'ai pas à me soucier du tout ...
PS. C'est une application ASP.NET - les connexions n'existent que pendant une requête Web. Pas une application ou un service gagnant.
la source
DbConnection.StateChange
événement pour surveiller les changements dans le changement d'état de la connexion (et peut être stocké localement) au lieu de vérifierDbConnection.State
directement la propriété. Cela vous fera économiser sur les coûts de performance.Réponses:
Tenez-vous-en à l'option a .
Le pool de connexions est votre ami.
la source
Utilisez la méthode (a) à chaque fois. Lorsque vous commencez à mettre à l'échelle votre application, la logique qui traite de l'état deviendra une vraie douleur si vous ne le faites pas.
Le regroupement de connexions fait ce qu'il dit sur l'étain. Pensez simplement à ce qui se passe lorsque l'application évolue et à quel point il serait difficile de gérer manuellement l'état d'ouverture / fermeture de la connexion. Le pool de connexions fait un excellent travail pour gérer automatiquement cela. Si vous êtes préoccupé par les performances, pensez à une sorte de mécanisme de cache mémoire afin que rien ne soit bloqué.
la source
Fermez toujours les connexions dès que vous en avez terminé, afin que la connexion à la base de données sous-jacente puisse revenir dans le pool et être disponible pour les autres appelants. Le regroupement de connexions est assez bien optimisé, il n'y a donc pas de pénalité notable pour cela. Le conseil est fondamentalement le même que pour les transactions - soyez bref et fermez lorsque vous avez terminé.
Cela devient plus compliqué si vous rencontrez des problèmes MSDTC en utilisant une seule transaction autour du code qui utilise plusieurs connexions, auquel cas vous devez en fait partager l'objet de connexion et le fermer uniquement une fois la transaction terminée.
Cependant, vous faites les choses à la main ici, vous voudrez peut-être étudier des outils qui gèrent les connexions pour vous, comme DataSets, Linq to SQL, Entity Framework ou NHibernate.
la source
Avertissement: je sais que c'est vieux, mais j'ai trouvé un moyen facile de démontrer ce fait, alors je mets ma valeur de deux cents.
Si vous avez du mal à croire que la mise en commun va vraiment être plus rapide, essayez ceci:
Ajoutez ce qui suit quelque part:
Maintenant, remplacez tous les appels
Open()
parTimedOpen()
et exécutez votre programme. Maintenant, pour chaque chaîne de connexion distincte que vous avez, la fenêtre de la console (sortie) aura une seule longue ouverture ouverte, et un tas d' ouvertures très rapides.Si vous souhaitez les étiqueter, vous pouvez ajouter
new StackTrace(true).GetFrame(1) +
à l'appel àWriteLine
.la source
Il existe des distinctions entre les connexions physiques et logiques. DbConnection est une sorte de connexion logique et utilise une connexion physique sous-jacente à Oracle. Fermer / ouvrir DbConnection n'affecte pas vos performances, mais rend votre code propre et stable - les fuites de connexion sont impossibles dans ce cas.
Vous devez également vous rappeler des cas où il existe des limitations pour les connexions parallèles sur le serveur de base de données - en tenant compte de cela, il est nécessaire de rendre vos connexions très courtes.
Le pool de connexions vous libère de la vérification de l'état de la connexion - il suffit de les ouvrir, de les utiliser et de les fermer immédiatement.
la source
Par exemple, lorsque l'utilisateur exécute une action de facturation, votre application doit d'abord trouver le solde de l'utilisateur et le mettre à jour, il doit utiliser la même connexion.
Même si ado.net a son pool de connexions, le coût de la connexion est très faible, mais la réutilisation de la connexion est un meilleur choix.
Étant donné que la connexion se bloque lorsque vous exécutez une requête ou une commande, cela signifie que votre application n'effectue qu'une seule opération de base de données à la même heure, quelles sont les performances médiocres.
Un autre problème est que votre application aura toujours une connexion même si votre utilisateur vient de l'ouvrir mais aucune opération.S'il y a de nombreux utilisateurs qui ouvrent votre application, le serveur db coûtera bientôt toute sa source de connexion alors que vos utilisateurs ne l'ont pas fait n'importe quoi.
la source