Partager via


Pool de connexions pour le fournisseur de données .NET Framework pour SQL Server

Le regroupement de connexions peut considérablement améliorer la performance et l'évolutivité de votre application. Le fournisseur de données .NET Framework pour SQL Server fournit automatiquement le regroupement de connexions pour votre application cliente ADO.NET. Vous pouvez aussi fournir plusieurs modificateurs de chaîne de connexion afin de contrôler le comportement du pool de connexions (consultez la section Contrôle des pools de connexions avec les mots clés des chaînes de connexion, plus loin dans cette rubrique).

Création et assignation d'un pool

Lorsqu'une connexion est ouverte, un pool de connexions est créé sur la base d'un algorithme à correspondance exacte qui associe le pool à la chaîne de connexion dans la connexion. Chaque pool de connexions est associé à une chaîne de connexion distincte. Lorsqu'une nouvelle connexion est ouverte, si la chaîne de connexion ne correspond pas exactement à un pool existant, un nouveau pool est créé.

Dans l'exemple suivant, trois nouveaux objets SqlConnection sont créés mais seuls deux pools sont nécessaires pour les gérer. Notez que les première et deuxième chaînes de connexion diffèrent par la valeur assignée pour Initial Catalog.

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";
conn.Open();      
// Pool A is created.

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=pubs";
conn.Open();      
// Pool B is created because the connection strings differ.

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";
conn.Open();      
// The connection string matches pool A.

Une fois créés, les pools de connexion ne sont détruits qu'à la fin du processus actif. La maintenance des pools inactifs ou vides implique une charge mémoire minimale du système.

Ajout de connexions

Un pool de connexions est créé pour chaque chaîne de connexion unique. Lorsqu'un pool est créé, plusieurs objets de connexion sont créés et ajoutés au pool de sorte que l'exigence de taille minimale du pool soit remplie. Les connexions sont ajoutées au pool jusqu'à ce que sa taille maximale soit atteinte.

Lorsqu'un objet SqlConnection est demandé, le pool indique si une connexion utilisable est disponible. Pour être utilisable, la connexion ne doit pas être en cours d'utilisation, avoir un contexte de transaction correspondant ou ne pas être associée à un contexte de transaction et avoir un lien valide vers le serveur.

Si la taille maximale du pool est atteinte et qu'aucune connexion utilisable n'est disponible, la demande est mise en attente. Le dispositif de regroupement répond à ces demandes en réallouant les connexions à mesure qu'elles se libèrent. Les connexions sont libérées et retournées au pool lorsque vous appelez Close ou Dispose sur l'objet Connection.

**ATTENTION   **Il est recommandé de toujours fermer l'objet Connection lorsque vous avez fini de l'utiliser, afin que la connexion soit retournée au pool. Pour cela, utilisez les méthodes Close ou Dispose de l'objet Connection. Les connexions qui ne sont pas explicitement fermées risquent de ne pas être ajoutées ni retournées au pool. Par exemple, une connexion devenue hors de portée mais qui n'a pas été explicitement fermée sera retournée au pool seulement si la taille maximale de celui-ci a été atteinte et que la connexion est toujours valide.

Remarque   N'appelez pas Close ou Dispose sur un objet Connection, DataReader ou tout autre objet managé dans la méthode Finalize de votre classe. Dans un finaliseur, libérez seulement les ressources non managées que votre classe possède directement. Si votre classe ne possède pas de ressources non managées, n'incluez pas la méthode Finalize dans votre définition de classe. Pour plus d'informations, consultez Programmation d'un garbage collection.

Suppression des connexions

Le dispositif de regroupement supprime une connexion du pool si sa durée de vie a expiré ou s'il détecte que la connexion avec le serveur a été interrompue. Notez que cela ne peut être détecté qu'après une tentative de communication avec le serveur. Si une connexion n'est plus reliée au serveur, elle est marquée comme étant non valide. Le dispositif de regroupement analyse périodiquement les pools de connexions à la recherche d'objets qui ont été libérés vers le pool et sont marqués comme étant non valides. Ces connexions sont alors définitivement supprimées.

Si une connexion à un serveur a disparu, il est possible de la retirer du pool, même si le dispositif de regroupement n'a pas détecté d'interruption de la connexion et ne l'a pas marquée comme étant non valide. Dans ce cas, une exception est générée. Vous devez cependant toujours fermer la connexion afin de la libérer à nouveau vers le pool.

Prise en charge des transactions

Les connexions sont retirées du pool et assignées en fonction du contexte de transaction. Le contexte du thread de demande et la connexion assignée doivent correspondre. Par conséquent, chaque pool de connexions est en fait sous-divisé en connexions auxquelles aucun contexte de transaction n'est associé et en N sous-divisions qui contiennent chacune des connexions avec un contexte de transaction particulier.

Lorsqu'une connexion est fermée, elle est libérée à nouveau vers le pool et dans la sous-division appropriée en fonction de son contexte de transaction. Par conséquent, vous pouvez fermer la connexion sans générer d'erreur, même si une transaction distribuée est toujours en attente. Ceci vous permet de valider ou d'abandonner ultérieurement la transaction distribuée.

Contrôle des pools de connexions avec les mots clés des chaînes de connexion

La propriété ConnectionString de l'objet SqlConnection prend en charge les paires clé-valeur des chaînes de connexion qui peuvent être utilisées pour ajuster le comportement de la logique de regroupement des connexions.

Le tableau suivant décrit les valeurs ConnectionString que vous pouvez utiliser pour ajuster le comportement de regroupement des connexions.

Name Default Description
Connection Lifetime 0 Lorsqu'une connexion est retournée au pool, l'heure de sa création est comparée à l'heure actuelle et la connexion est détruite si cet intervalle de temps (en secondes) excède la valeur spécifiée par Connection Lifetime. Ceci est utile dans les configurations en clusters pour forcer l'équilibrage de la charge entre un serveur en cours d'exécution et un serveur qui vient d'être mis en ligne.

La valeur zéro (0) aura pour conséquence un délai d'attente maximal pour les connexions regroupées.

Connection Reset 'true' Détermine si la connexion de base de données est réinitialisée lorsqu'elle est supprimée du pool. Pour Microsoft SQL Server version 7.0, false évite un aller-retour supplémentaire du serveur lors de l'établissement d'une connexion, mais vous devez savoir que l'état de connexion, comme le contexte de base de données, n'est pas réinitialisé.
Enlist 'true' Si la valeur est true, le dispositif de regroupement inscrit automatiquement la connexion dans le contexte de transaction en cours du thread de création si un contexte de transaction existe.
Max Pool Size 100 Nombre maximal de connexions autorisées dans le pool.
Min Pool Size 0 Nombre minimal de connexions conservées dans le pool.
Pooling 'true' Si la valeur est true, la connexion est retirée du pool approprié ou, si nécessaire, créée et ajoutée au pool approprié.

Compteurs de performance pour le regroupement de connexions

Le fournisseur de données .NET Framework pour SQL Server ajoute plusieurs compteurs de performance qui vous permettent d'ajuster les caractéristiques de regroupement des connexions, de détecter les problèmes intermittents relatifs aux tentatives de connexion ayant échoué et ceux relatifs aux demandes à SQL Server dont le délai a été dépassé.

Le tableau suivant répertorie les compteurs de regroupement des connexions accessibles dans l'Analyseur de performances sous l'objet de performance .NET CLR Data.

Compteur Description
SqlClient : Nb. actuel de connexions de pool ou hors pool Nombre actuel de connexions regroupées et non regroupées.
SqlClient : Nb. actuel de connexions de pool Nombre actuel de connexions dans tous les pools associés au processus.
SqlClient : Nb. actuel de pools de connexion Nombre actuel de pools associés au processus.
SqlClient : Nb. max. de connexions de pool Nombre le plus élevé de connexions dans tous les pools depuis le début du processus. Remarque : ce compteur n'est disponible que s'il est associé à une instance de processus spécifique. L'instance _Global retournera toujours 0.
SqlClient : Nb. total de connexions ayant échoué Nombre total de tentatives d'ouverture de connexion ayant échoué pour une raison quelconque.

Remarque   Lorsque vous utilisez les compteurs de performance du fournisseur de données .NET Framework pour SQL Server avec des applications ASP.NET, seule l'instance _Global est disponible. Par conséquent, la valeur retournée par le compteur de performance est la somme des valeurs de compteur de toutes les applications ASP.NET.

Voir aussi

Connexion à une source de données à l'aide de ADO.NET | Utilisation des fournisseurs de données .NET Framework pour l'accès aux données | SqlConnection, classe