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:
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:
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.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.
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'
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