Regroupement de connexions SQL Server (ADO.NET)SQL Server Connection Pooling (ADO.NET)

La connexion à un serveur de base de données consiste généralement en plusieurs étapes de longue durée.Connecting to a database server typically consists of several time-consuming steps. Un canal physique tel qu'un socket ou un canal nommé doit être établi, le contrôle initial avec le serveur doit avoir lieu, les informations de chaîne de connexion doivent être analysées, la connexion doit être authentifiée par le serveur, des contrôles doivent être effectués pour l'inscription dans la transaction en cours, etc.A physical channel such as a socket or a named pipe must be established, the initial handshake with the server must occur, the connection string information must be parsed, the connection must be authenticated by the server, checks must be run for enlisting in the current transaction, and so on.

Dans la pratique, la plupart des applications utilisent une seule des quelques configurations pour les connexions.In practice, most applications use only one or a few different configurations for connections. Cela signifie que, durant l'exécution de l'application, de nombreuses connexions identiques seront ouvertes et fermées à plusieurs reprises.This means that during application execution, many identical connections will be repeatedly opened and closed. Pour réduire le coût de l’ouverture de connexions, ADO.NET utilise une technique d’optimisation nommée le regroupement de connexions.To minimize the cost of opening connections, ADO.NET uses an optimization technique called connection pooling.

Le regroupement de connexions réduit le nombre de fois où il est nécessaire d'ouvrir de nouvelles connexions.Connection pooling reduces the number of times that new connections must be opened. Le pooler conserve la propriété de la connexion physique.The pooler maintains ownership of the physical connection. Elle gère les connexions en conservant en vie un ensemble de connexions actives pour chaque configuration de connexion donnée.It manages connections by keeping alive a set of active connections for each given connection configuration. Chaque fois qu'un utilisateur appelle Open sur une connexion, le dispositif de regroupement de connexions recherche une connexion disponible dans le pool.Whenever a user calls Open on a connection, the pooler looks for an available connection in the pool. Si une connexion regroupée est disponible, le dispositif de regroupement de connexions la retourne à l'appelant au lieu d'ouvrir une nouvelle connexion.If a pooled connection is available, it returns it to the caller instead of opening a new connection. Lorsque l'application appelle Close sur la connexion, le dispositif de regroupement de connexions la retourne à l'ensemble regroupé de connexions actives au lieu de la fermer.When the application calls Close on the connection, the pooler returns it to the pooled set of active connections instead of closing it. Une fois la connexion retournée au pool, elle est prête à être réutilisée sur l'appel de Open suivant.Once the connection is returned to the pool, it is ready to be reused on the next Open call.

Seules les connexions utilisant la même configuration peuvent être groupées par pools.Only connections with the same configuration can be pooled. ADO.NET conserve plusieurs pools en même temps, un pour chaque configuration.ADO.NET keeps several pools at the same time, one for each configuration. Les connexions sont séparées en pools par chaîne de connexion, ainsi que par identité Windows en cas d'utilisation de la sécurité intégrée.Connections are separated into pools by connection string, and by Windows identity when integrated security is used. Les connexions sont également regroupées selon si elles sont inscrites dans une transaction.Connections are also pooled based on whether they are enlisted in a transaction. Lorsque vous utilisez ChangePassword, l'instance SqlCredential affecte le pool de connexions.When using ChangePassword, the SqlCredential instance affects the connection pool. Les différentes instances de SqlCredential utilisent différents pool de connexions, même si l'ID d'utilisateur et le mot de passe sont identiques.Different instances of SqlCredential will use different connection pools, even if the user ID and password are the same.

Le regroupement de connexions peut considérablement améliorer les performances et l'évolutivité de votre application.Pooling connections can significantly enhance the performance and scalability of your application. Par défaut, le regroupement de connexions est activé dans ADO.NET.By default, connection pooling is enabled in ADO.NET. À moins que vous ne le désactiviez explicitement, le dispositif de regroupement de connexions optimise les connexions au fur et à mesure de leur ouverture et de leur fermeture dans votre application.Unless you explicitly disable it, the pooler optimizes the connections as they are opened and closed in your application. Vous pouvez également fournir plusieurs modificateurs de chaîne de connexion pour contrôler le comportement de regroupement de connexions.You can also supply several connection string modifiers to control connection pooling behavior. Pour plus d'informations, voir la section sur le contrôle des pools de connexions avec les mots clés des chaînes de connexion, plus loin dans cette rubrique.For more information, see "Controlling Connection Pooling with Connection String Keywords" later in this topic.

Notes

Lorsque le regroupement de connexions est activé, et si une erreur de délai d'attente ou toute autre erreur de connexion se produit, une exception est levée et les tentatives de connexion suivantes échouent pendant les cinq secondes suivantes, « la période de blocage ».When connection pooling is enabled, and if a timeout error or other login error occurs, an exception will be thrown and subsequent connection attempts will fail for the next five seconds, the "blocking period". Si l'application essaie de se connecter au cours de la période de blocage, la première exception sera levée de nouveau.If the application attempts to connect within the blocking period, the first exception will be thrown again. Les échecs suivants à l'issue d'une période de blocage entraînent de nouvelles périodes de blocage deux fois plus longues que la période de blocage précédente, d'une durée maximale d'une minute.Subsequent failures after a blocking period ends will result in a new blocking periods that is twice as long as the previous blocking period, up to a maximum of one minute.

Création et assignation d'un poolPool Creation and Assignment

Lorsqu'une connexion est ouverte pour la première fois, 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.When a connection is first opened, a connection pool is created based on an exact matching algorithm that associates the pool with the connection string in the connection. Chaque pool de connexions est associé à une chaîne de connexion distincte.Each connection pool is associated with a distinct connection string. Lorsqu'une nouvelle connexion est ouverte, si la chaîne de connexion ne correspond pas exactement à un pool existant, un nouveau pool est créé.When a new connection is opened, if the connection string is not an exact match to an existing pool, a new pool is created. Les connexions sont regroupées par processus, par domaine d'application, par chaîne de connexion et, en cas d'utilisation de la sécurité intégrée, par identité Windows.Connections are pooled per process, per application domain, per connection string and when integrated security is used, per Windows identity. Les chaînes de connexion doivent également parfaitement correspondre ; les mots clés fournis dans un ordre différent pour la même connexion sont regroupés séparément.Connection strings must also be an exact match; keywords supplied in a different order for the same connection will be pooled separately.

Dans l'exemple C# suivant, trois nouveaux objets SqlConnection sont créés mais seuls deux pools sont nécessaires pour les gérer.In the following C# example, three new SqlConnection objects are created, but only two connection pools are required to manage them. Notez que les première et deuxième chaînes de connexion diffèrent par la valeur assignée pour Initial Catalog.Note that the first and second connection strings differ by the value assigned for Initial Catalog.

using (SqlConnection connection = new SqlConnection(  
  "Integrated Security=SSPI;Initial Catalog=Northwind"))  
    {  
        connection.Open();        
        // Pool A is created.  
    }  
  
using (SqlConnection connection = new SqlConnection(  
  "Integrated Security=SSPI;Initial Catalog=pubs"))  
    {  
        connection.Open();        
        // Pool B is created because the connection strings differ.  
    }  
  
using (SqlConnection connection = new SqlConnection(  
  "Integrated Security=SSPI;Initial Catalog=Northwind"))  
    {  
        connection.Open();        
        // The connection string matches pool A.  
    }  

Si MinPoolSize n'est pas spécifié dans la chaîne de connexion ou est spécifié comme zéro, les connexions du pool sont fermées après une période d'inactivité.If MinPoolSize is either not specified in the connection string or is specified as zero, the connections in the pool will be closed after a period of inactivity. En revanche, si le MinPoolSize spécifié est supérieur à zéro, le pool de connexion n'est pas détruit tant que le AppDomain n'a pas été déchargé et que le processus ne s'est pas terminé.However, if the specified MinPoolSize is greater than zero, the connection pool is not destroyed until the AppDomain is unloaded and the process ends. La maintenance des pools inactifs ou vides implique une charge mémoire minimale du système.Maintenance of inactive or empty pools involves minimal system overhead.

Notes

Le pool est automatiquement effacé si une erreur irrécupérable survient, telle qu'un basculement.The pool is automatically cleared when a fatal error occurs, such as a failover.

Ajout de connexionsAdding Connections

Un pool de connexions est créé pour chaque chaîne de connexion unique.A connection pool is created for each unique connection string. 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.When a pool is created, multiple connection objects are created and added to the pool so that the minimum pool size requirement is satisfied. Les connexions sont ajoutées au pool jusqu'à ce que sa taille maximale spécifiée soit atteinte (la valeur par défaut est 100).Connections are added to the pool as needed, up to the maximum pool size specified (100 is the default). Les connexions sont libérées et retournées au pool en cas de fermeture ou de suppression.Connections are released back into the pool when they are closed or disposed.

Quand un objet SqlConnection est demandé, il est obtenu du pool si une connexion utilisable est disponible.When a SqlConnection object is requested, it is obtained from the pool if a usable connection is available. Pour être utilisable, la connexion ne doit pas être en cours d'utilisation, doit avoir un contexte de transaction correspondant ou ne pas être associée à un contexte de transaction et doit avoir un lien valide vers le serveur.To be usable, a connection must be unused, have a matching transaction context or be unassociated with any transaction context, and have a valid link to the server.

Le dispositif de regroupement de connexions répond à ces requêtes de connexion en réallouant les connexions à mesure qu'elles se libèrent dans le pool.The connection pooler satisfies requests for connections by reallocating connections as they are released back into the pool. Si la taille maximale du pool est atteinte et qu'aucune connexion utilisable n'est disponible, la requête est mise en attente.If the maximum pool size has been reached and no usable connection is available, the request is queued. Le dispositif de regroupement de connexions tente ensuite de récupérer des connexions jusqu'à ce que le délai de temporisation ait expiré (la valeur par défaut est de 15 secondes).The pooler then tries to reclaim any connections until the time-out is reached (the default is 15 seconds). Si le dispositif de regroupement de connexions ne peut pas répondre à la requête avant que le délai de temporisation de la connexion ait expiré, une exception est levée.If the pooler cannot satisfy the request before the connection times out, an exception is thrown.

Attention

Il est vivement recommandé de toujours fermer la connexion lorsque vous avez terminé de l'utiliser, de sorte qu'elle soit retournée au pool.We strongly recommend that you always close the connection when you are finished using it so that the connection will be returned to the pool. Vous pouvez le faire à l’aide la Close ou Dispose méthodes de la Connection de l’objet, ou en ouvrant toutes les connexions à l’intérieur d’un using instruction en langage c#, ou un Using instruction en Visual Basic.You can do this using either the Close or Dispose methods of the Connection object, or by opening all connections inside a using statement in C#, or a Using statement in Visual Basic. Les connexions qui ne sont pas explicitement fermées risquent de ne pas être ajoutées ni retournées au pool.Connections that are not explicitly closed might not be added or returned to the pool. Pour plus d’informations, consultez à l’aide d’instruction ou Comment : Supprimer une ressource système pour Visual Basic.For more information, see using Statement or How to: Dispose of a System Resource for Visual Basic.

Notes

N'appelez pas une commande Close ou Dispose sur une Connection, un DataReader ou tout autre objet managé dans la méthode Finalize de votre classe.Do not call Close or Dispose on a Connection, a DataReader, or any other managed object in the Finalize method of your class. Dans un finaliseur, libérez seulement les ressources non managées que votre classe possède directement.In a finalizer, only release unmanaged resources that your class owns directly. Si votre classe ne possède pas de ressource non managée, n'incluez pas une méthode Finalize dans la définition de classe.If your class does not own any unmanaged resources, do not include a Finalize method in your class definition. Pour plus d’informations, consultez Garbage Collection.For more information, see Garbage Collection.

Pour plus d’informations sur les événements liés à l’ouverture et fermeture des connexions, consultez classe d’événements Audit Login et classe d’événements Audit Logout dans la documentation de SQL Server.For more info about the events associated with opening and closing connections, see Audit Login Event Class and Audit Logout Event Class in the SQL Server documentation.

Suppression de connexionsRemoving Connections

Le dispositif de regroupement de connexions supprime une connexion du pool restée inactive pendant environ 4 à 8 minutes ou s'il détecte que la connexion au serveur a été interrompue.The connection pooler removes a connection from the pool after it has been idle for approximately 4-8 minutes, or if the pooler detects that the connection with the server has been severed. Notez qu'une connexion interrompue ne peut être détectée qu'après une tentative de communication avec le serveur.Note that a severed connection can be detected only after attempting to communicate with the server. Si une connexion n'est plus reliée au serveur, elle est marquée comme étant non valide.If a connection is found that is no longer connected to the server, it is marked as invalid. Les connexions non valides ne sont supprimées du pool de connexions que lorsqu'elles sont fermées ou récupérées.Invalid connections are removed from the connection pool only when they are closed or reclaimed.

Si une connexion existante à un serveur a disparu, il est possible de la retirer du pool même si le dispositif de regroupement de connexions n'a pas détecté d'interruption de la connexion et ne l'a pas marquée comme non valide.If a connection exists to a server that has disappeared, this connection can be drawn from the pool even if the connection pooler has not detected the severed connection and marked it as invalid. C'est le cas parce que la charge de vérifier que la connexion est encore valide éliminerait les avantages liés au fait de disposer d'une fonction de regroupement de connexions en entraînant un aller-retour supplémentaire vers le serveur.This is the case because the overhead of checking that the connection is still valid would eliminate the benefits of having a pooler by causing another round trip to the server to occur. Lorsque cela se produit, la première tentative d'utilisation de la connexion détecte que la connexion a été interrompue et une exception est levée.When this occurs, the first attempt to use the connection will detect that the connection has been severed, and an exception is thrown.

Effacement du poolClearing the Pool

ADO.NET 2.0 introduit deux nouvelles méthodes pour effacer le pool : ClearAllPools et ClearPool.ADO.NET 2.0 introduced two new methods to clear the pool: ClearAllPools and ClearPool. ClearAllPools efface les pools de connexions pour un fournisseur donné et ClearPool efface le pool de connexions associé à une connexion spécifique.ClearAllPools clears the connection pools for a given provider, and ClearPool clears the connection pool that is associated with a specific connection. Si des connexions sont utilisées au moment de l'appel, elles sont marquées de façon appropriée.If there are connections being used at the time of the call, they are marked appropriately. Lors de leur fermeture, elles sont écartées au lieu d'être retournées au pool.When they are closed, they are discarded instead of being returned to the pool.

Prise en charge des transactionsTransaction Support

Les connexions sont retirées du pool et assignées en fonction du contexte de transaction.Connections are drawn from the pool and assigned based on transaction context. À moins que Enlist=false ne soit spécifié dans la chaîne de connexion, le pool de connexions s'assure que la connexion est inscrite dans le contexte Current.Unless Enlist=false is specified in the connection string, the connection pool makes sure that the connection is enlisted in the Current context. Lorsqu'une connexion est fermée et retournée au pool avec une transaction System.Transactions inscrite, elle est mise de côté de sorte que la demande suivante de ce pool de connexions avec la même transaction System.Transactions retourne la même connexion, si elle est disponible.When a connection is closed and returned to the pool with an enlisted System.Transactions transaction, it is set aside in such a way that the next request for that connection pool with the same System.Transactions transaction will return the same connection if it is available. Si une telle demande est émise et qu'aucune connexion regroupée n'est disponible, une connexion est retirée de la partie non traitée du pool et est inscrite.If such a request is issued, and there are no pooled connections available, a connection is drawn from the non-transacted part of the pool and enlisted. Si aucune connexion n'est disponible où que ce soit dans le pool, une nouvelle connexion est créée et inscrite.If no connections are available in either area of the pool, a new connection is created and enlisted.

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.When a connection is closed, it is released back into the pool and into the appropriate subdivision based on its transaction context. 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.Therefore, you can close the connection without generating an error, even though a distributed transaction is still pending. Cela vous permet de valider ou d'abandonner ultérieurement la transaction distribuée.This allows you to commit or abort the distributed transaction later.

Contrôle des pools de connexions avec les mots clés des chaînes de connexionControlling Connection Pooling with Connection String Keywords

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.The ConnectionString property of the SqlConnection object supports connection string key/value pairs that can be used to adjust the behavior of the connection pooling logic. Pour plus d'informations, consultez ConnectionString.For more information, see ConnectionString.

Fragmentation de poolPool Fragmentation

La fragmentation de pool est un problème courant dans de nombreuses applications Web où l'application peut créer un grand nombre de pools qui ne sont pas libérés tant que le processus n'est pas terminé.Pool fragmentation is a common problem in many Web applications where the application can create a large number of pools that are not freed until the process exits. Cela laisse un grand nombre de connexions ouvertes qui consomment de la mémoire et altèrent les performances.This leaves a large number of connections open and consuming memory, which results in poor performance.

Fragmentation de pool due à une sécurité intégréePool Fragmentation Due to Integrated Security

Les connexions sont regroupées en fonction de la chaîne de connexion et de l'identité de l'utilisateur.Connections are pooled according to the connection string plus the user identity. C'est pourquoi, si vous utilisez une authentification de base ou une authentification Windows sur le site Web ainsi qu'une connexion sécurisée intégrée, vous obtenez un pool par utilisateur.Therefore, if you use Basic authentication or Windows Authentication on the Web site and an integrated security login, you get one pool per user. Bien que cela améliore les performances des requêtes de base de données suivantes pour un utilisateur donné, ce dernier ne peut pas tirer parti des connexions établies par d'autres utilisateurs.Although this improves the performance of subsequent database requests for a single user, that user cannot take advantage of connections made by other users. Cela génère également au moins une connexion au serveur de base de données par utilisateur.It also results in at least one connection per user to the database server. Il s'agit d'un effet secondaire d'une architecture d'application Web particulière que les développeurs doivent soupeser par rapport aux exigences de sécurité et d'audit.This is a side effect of a particular Web application architecture that developers must weigh against security and auditing requirements.

Fragmentation de pool due à un trop grand nombre de base de donnéesPool Fragmentation Due to Many Databases

De nombreux fournisseurs de services Internet hébergent plusieurs sites Web sur un seul serveur.Many Internet service providers host several Web sites on a single server. Ils peuvent utiliser une seule base de données pour confirmer une connexion d'authentification Forms, puis ouvrir une connexion à une base de données spécifique pour cet utilisateur ou ce groupe d'utilisateurs.They may use a single database to confirm a Forms authentication login and then open a connection to a specific database for that user or group of users. La connexion à la base de données d'authentification est regroupée et utilisée par tout le monde.The connection to the authentication database is pooled and used by everyone. Toutefois, il existe un pool de connexions distinct à chaque base de données, ce qui augmente le nombre de connexions au serveur.However, there is a separate pool of connections to each database, which increase the number of connections to the server.

Cela est également un effet secondaire de la conception de l'application.This is also a side-effect of the application design. Il existe une méthode relativement simple pour éviter cet effet secondaire sans compromettre la sécurité lors de la connexion à SQL Server.There is a relatively simple way to avoid this side effect without compromising security when you connect to SQL Server. Au lieu d'établir une connexion à une base de données distincte pour chaque utilisateur ou groupe d'utilisateurs, établissez une connexion à la même base de données sur le serveur, puis exécutez l'instruction Transact-SQL USE pour accéder à la base de données souhaitée.Instead of connecting to a separate database for each user or group, connect to the same database on the server and then execute the Transact-SQL USE statement to change to the desired database. Le fragment de code suivant montre comment créer une connexion initiale à la base de données master, puis basculer vers la base de données souhaitée spécifiée dans la variable chaîne databaseName.The following code fragment demonstrates creating an initial connection to the master database and then switching to the desired database specified in the databaseName string variable.

' Assumes that command is a valid SqlCommand object and that  
' connectionString connects to master.  
    command.Text = "USE DatabaseName"  
Using connection As New SqlConnection(connectionString)  
    connection.Open()  
    command.ExecuteNonQuery()  
End Using  
// Assumes that command is a SqlCommand object and that  
// connectionString connects to master.  
command.Text = "USE DatabaseName";  
using (SqlConnection connection = new SqlConnection(  
  connectionString))  
  {  
    connection.Open();  
    command.ExecuteNonQuery();  
  }  

Rôles d'application et regroupement de connexionsApplication Roles and Connection Pooling

Après qu'un rôle d'application SQL Server a été activé en appelant la procédure stockée système sp_setapprole, le contexte de sécurité de cette connexion ne peut pas être rétabli.After a SQL Server application role has been activated by calling the sp_setapprole system stored procedure, the security context of that connection cannot be reset. Toutefois, lorsque le regroupement est activé, la connexion est retournée au pool et une erreur se produit en cas de réutilisation de la connexion regroupée.However, if pooling is enabled, the connection is returned to the pool, and an error occurs when the pooled connection is reused. Pour plus d’informations, consultez l’article de la Base de connaissances, «erreurs du rôle d’application SQL avec OLE DB resource pooling. »For more information, see the Knowledge Base article, "SQL application role errors with OLE DB resource pooling."

Alternatives aux rôles d'applicationApplication Role Alternatives

Il est recommandé de tirer parti des mécanismes de sécurité qui peuvent être employés à la place des rôles d'application.We recommend that you take advantage of security mechanisms that you can use instead of application roles. Pour plus d’informations, consultez création de rôles d’Application dans SQL Server.For more information, see Creating Application Roles in SQL Server.

Voir aussiSee also