Pool de connexions max plafonné à 100

27

J'exécute SQL Server 2008 R2 SP1, sur une boîte Windows Server 2008. J'ai un script .NET exécuté à partir de Visual Studio 2010 qui fait ce qui suit:

  • Atteint la base de données
  • Fait un changement
  • Itère

Le nombre total de fois qu'il itérera est de 150, mais il s'arrête à 100 connexions et je ne peux pas comprendre pourquoi. Je pourrais ajuster mon script pour n'utiliser qu'un seul thread, mais je préférerais savoir où il me manque un paramètre de connexion max car cela sera plus utile de le savoir pour référence future.

Voici où j'ai vérifié jusqu'à présent:

  • Chaîne de connexion SQL dans Visual Studio 2010 (elle est définie sur 1000)
  • Propriétés de connexion de l'instance de base de données SSMS (elle est définie sur 0 [infini] connexions utilisateur)
  • Googlé quelques informations sur Server 2008, il semble qu'il puisse gérer plus de 100 connexions
  • J'ai parcouru mon code à côté de SP_WHO2ce qui donne plus d'informations sur les connexions logiques, car le nombre de connexions commence à 52 et les erreurs de script avec l'erreur "Max Pooled Connections atteint" à 152 connexions logiques.
  • Modification de la chaîne de connexion à utiliser Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000

Je ne sais pas où vérifier, je sais que j'ai beaucoup de pièces mobiles ici, mais j'ai l'impression qu'il me manque un paramètre de piscine max quelque part.

Sean Long
la source
1
Pouvez-vous publier votre chaîne de connexion? Veuillez voir ma réponse. Cela devrait être votre remède (cette valeur sera spécifiée dans la chaîne de connexion. La valeur par System.Data.SqlClientdéfaut est 100, c'est pourquoi vous voyez l'épuisement du pool de connexions).
Thomas Stringer

Réponses:

24

SQL Server autorise un maximum de 32767 connexions par défaut. Il peut être modifié à l'aide de sp_configure. Pour afficher votre configuration actuelle pour ce paramètre, utilisez la requête suivante:

select * from sys.configurations
where name ='user connections'

Par défaut, vous devriez voir un maximum de 32767, value_in_useégal à 0 (utilisez les paramètres par défaut). Si cela a été modifié, vous pouvez reconfigurer SQL Server pour utiliser d'autres valeurs comme décrit dans le lien.

Vous devez également vérifier le nombre de connexions réellement établies, car il pourrait y avoir plus d'activité en dehors de votre application (ou votre application établit plus de connexions que vous ne le pensez). Vous voudrez regarder Statistiques générales -> Connexions logiques dans perfmon ou interroger les valeurs dans sys.dm_os_performance_counters(cntr_value affichera la valeur actuelle du point dans le temps):

select * from sys.dm_os_performance_counters
where counter_name ='User Connections'
Mike Fal
la source
Oui, j'ai déjà vérifié les connexions utilisateur (c'est la première chose à laquelle je suis allé, et c'est le plus facile à trouver à la fois dans l'interface utilisateur et dans la documentation de Microsoft. J'ai également parcouru mon code et gardé un œil sur le nombre de connexions logiques via SSMS par en utilisant SP_WHO2, ce qui donne une quantité décente d'informations sur les connexions logiques. Au ralenti, mon serveur a 51 connexions. Lorsque le script échoue, il a créé 100 connexions supplémentaires. Voilà comment je suis arrivé là où je suis maintenant.
Sean Long
J'ai clarifié ma question un peu plus avec les mesures que j'ai prises. Ce n'est peut-être pas du tout un paramètre dans SQL, c'est pourquoi j'ai commencé à regarder les paramètres Windows et Visual Studio.
Sean Long
1
Si vous avez vérifié tout cela et qu'il échoue toujours à 100 connexions, la réponse se situe en dehors des paramètres de la base de données. Pour info, ces 51 connexions sont tous les processus du système (+1 pour vous-même).
Mike Fal
Pour terminer, ce dernier commentaire s'est avéré exact. J'ai regardé de plus près pourquoi ces 100 connexions étaient créées et j'ai trouvé une fuite dans le code. Après avoir corrigé cela, cela fonctionne bien. Les informations ci-dessus sont toutes encore très utiles, et j'espère que d'autres les trouveront également utiles.
Sean Long
25

Dans votre chaîne de connexion, spécifiez max pool size=<your desired max pool size>. En d'autres termes, si vous souhaitez modifier la taille maximale du pool à la valeur 500, votre chaîne de connexion pourrait ressembler à ceci:

"data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500"

Évidemment, je suppose beaucoup avec vos autres paramètres, mais cela devrait vous donner une bonne idée de la façon de procéder. Le regroupement de connexions est l'application du fournisseur côté client. C'est le client qui devra spécifier ce paramètre de taille maximale de pool, via la chaîne de connexion.

Assurez-vous également que vous fermez ou éliminez correctement vos connexions, sinon vous les bloquerez. Quelque chose comme ça (C #):

string connectionString = "data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500";

using (SqlConnection dbConn = new SqlConnection(connectionString))
{
    using (SqlCommand sqlCmd = new SqlCommand())
    {
        sqlCmd.Connection = dbConn;
        sqlCmd.CommandText = "select 1;";

        // ... so on and so forth
    }
}

Le usingbloc (en C #) appelle IDisposable.Dispose()à la fin. Vous pouvez également implémenter SqlConnection.Dispose()ou SqlConnection.Close()dans le finallybloc d'un try/catch/finallybloc.

Référence: documentation MSDN sur la propriété SqlConnection.ConnectionString

Thomas Stringer
la source
Voici la chaîne de connexion, mettant également à jour ma question. Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000
Sean Long
3
Est-ce votre chaîne de connexion partout ? La raison pour laquelle je demande, c'est parce que différentes chaînes de connexion vont être des pools de connexion différents.
Thomas Stringer
C'est une très, très bonne question. J'ai vérifié 3 chaînes de connexion jusqu'à présent, mais elles poussent toutes pour un pool max élevé. Je vais voir si je peux trouver une autre chaîne qui pourrait la provoquer.
Sean Long
Si vous venez de déboguer l'exécution, vous devriez pouvoir voir quelle est la valeur d'exécution de SqlConnection.ConnectionStringl'opération particulière. Ce serait le moyen le plus simple. S'il max pool sizen'y en a pas, c'est 100 alors.
Thomas Stringer
1
Cela devrait être marqué comme la réponse acceptée car il répond en fait correctement à l'OP. Il mentionne à la fois le paramètre de chaîne de connexion client Max Pool Size et la nécessité de fermer / supprimer les connexions.
Adam Caviness