Rappelez-vous tout cela dans le contexte de l'écosystème .Net.
Les développeurs veulent parfois "optimiser" leur code pour réutiliser leurs objets de connexion. Compte tenu du contexte de cette question, il s’agit presque toujours d’une erreur.
ADO.Net possède une fonctionnalité appelée Pooling de connexion . Lorsque vous créez et ouvrez un nouvel objet de connexion, vous demandez réellement une connexion à un pool. Lorsque vous fermez une connexion, vous la renvoyez à la piscine.
Il est important de comprendre les objets que nous utilisons directement dans le code: SqlConnection, MySQLConnection, OleDbConnectio, etc, sont tous à enrubanneuse autour d' une véritable connexion sous - jacente gérée par ADO.Net et les connexions réelles ADO.Net sont beaucoup plus « lourd » et plus cher du point de vue de la performance. Ce sont ces objets sous-jacents qui suscitent des inquiétudes telles que l'authentification, le transit sur le réseau, le cryptage, et ces éléments dépassent de loin la faible quantité de mémoire de l'objet que vous voyez réellement dans votre propre code.
Lorsque vous essayez de réutiliser votre objet de connexion, vous empêchez ADO.Net de gérer efficacement les connexions sous-jacentes importantes. Vous gagnez en efficacité dans les petites choses au détriment des choses beaucoup plus grandes.
La réutilisation d'une connexion via une application ou une demande http peut également vous obliger à sérialiser accidentellement un élément qui pourrait sinon être exécuté en parallèle et à devenir un goulot d'étranglement des performances. J'ai vu cela se produire dans de vraies applications.
Dans le cas de l'exemple de page Web ici, où vous ne gardez au moins que la petite connexion pendant la durée d'une requête / réponse http unique, vous pourriez gagner encore en efficacité en évaluant les requêtes que vous exécutez dans votre pipeline de requêtes et en essayant d'obtenir réduisez le nombre de requêtes distinctes à la base de données (astuce: vous pouvez soumettre plusieurs requêtes dans une seule chaîne SQL et utiliser DataReader.NextResult()
ou vérifier différentes tables de manière DataSet
à les déplacer).
En d'autres termes, plutôt que de penser à réutiliser une connexion pour une application ou une requête http par rapport à une connexion par requête, pensez en termes d'une connexion pour chaque appel à la base de données ... à chaque aller-retour. Essayez ensuite de minimiser le nombre de connexions en minimisant le nombre de ces voyages. De cette façon, vous pouvez atteindre les deux objectifs.
Mais ce n'est qu'un type d'optimisation. Il y a aussi l'optimisation du temps de programmation et la réutilisation efficace du code. Les développeurs ne veulent pas écrire le même code standard, encore et encore, juste pour obtenir un objet de connexion ouvert et prêt à être utilisé. Ce n'est pas seulement fastidieux, c'est un moyen d'introduire des bogues dans un programme.
Même ici, cependant, il est généralement préférable d’avoir une connexion par requête (ou aller-retour). Il existe d'autres modèles que vous pouvez utiliser pour éviter de réécrire le même code standard. Voici un exemple que j'aime bien, mais il y en a beaucoup d'autres.