web-dev-qa-db-fra.com

Pool de connexions max plafonné à 100

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 il 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 aux côtés de SP_WHO2 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 pour 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.

28
Sean Long

SQL Server autorise un maximum de 2767 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 examiner 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 de temps):

select * from sys.dm_os_performance_counters
where counter_name ='User Connections'
24
Mike Fal

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 bloc using (en C #) appelle IDisposable.Dispose() une fois terminé. Vous pouvez également implémenter SqlConnection.Dispose() ou SqlConnection.Close() dans le bloc finally d'un bloc try/catch/finally.

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

26
Thomas Stringer