Maximaler Verbindungspool auf 100 begrenzt


27

Ich verwende SQL Server 2008 R2 SP1 auf einem Windows Server 2008-Computer. Ich habe ein .NET-Skript, das in Visual Studio 2010 ausgeführt wird und Folgendes ausführt:

  • Greift in die Datenbank ein
  • Nimmt eine Änderung vor
  • Iteriert

Es werden insgesamt 150 Iterationen durchgeführt, es werden jedoch 100 Verbindungen angehalten, und ich kann nicht herausfinden, warum. Ich könnte mein Skript so anpassen, dass nur ein einziger Thread verwendet wird, aber ich würde es vorziehen, zu wissen, wo ich eine Einstellung für die maximale Verbindung vermisse, da dies für zukünftige Referenzzwecke nützlicher ist.

Hier ist, wo ich bis jetzt überprüft habe:

  • SQL-Verbindungszeichenfolge in Visual Studio 2010 (auf 1000 festgelegt)
  • Verbindungseigenschaften der SSMS-Datenbankinstanz (auf 0 [unendlich] Benutzerverbindungen festgelegt)
  • Wenn Sie einige Informationen zu Server 2008 googeln, können anscheinend mehr als 100 Verbindungen verarbeitet werden
  • Ich habe meinen Code durchgearbeitet, SP_WHO2der weitere Informationen zu logischen Verbindungen enthält. Dabei wurde festgestellt, dass die Anzahl der Verbindungen bei 52 beginnt und die Skriptfehler bei 152 logischen Verbindungen mit dem Fehler "Max. Verbindungen im Pool erreicht".
  • Die zu verwendende Verbindungszeichenfolge wurde geändert Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000

Ich bin mir nicht sicher, wo ich sonst nachsehen soll. Ich weiß, dass ich viele bewegliche Teile hier habe, aber ich habe das Gefühl, dass ich irgendwo eine maximale Pooleinstellung verpasse.


1
Können Sie Ihre Verbindungszeichenfolge posten? Bitte sehen Sie meine Antwort. Dies sollte Ihre Abhilfe sein (dieser Wert wird in der Verbindungszeichenfolge angegeben. Der System.Data.SqlClientStandardwert ist 100, weshalb der Verbindungspool erschöpft ist).
Thomas Stringer

Antworten:


24

SQL Server lässt standardmäßig maximal 32767 Verbindungen zu . Sie kann mit geändert werden sp_configure. Verwenden Sie die folgende Abfrage, um Ihre aktuelle Konfiguration für diese Einstellung anzuzeigen:

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

Standardmäßig sollte ein Maximum von 32767 angezeigt werden, value_in_usedas 0 entspricht (verwenden Sie die Standardeinstellungen). Wenn dies geändert wurde, können Sie SQL Server so konfigurieren, dass andere Werte verwendet werden, wie im Link beschrieben.

Sie sollten auch überprüfen, wie viele Verbindungen tatsächlich hergestellt werden, da möglicherweise mehr Aktivitäten außerhalb Ihrer Anwendung stattfinden (oder Ihre Anwendung mehr Verbindungen herstellt, als Sie denken). Sie sollten entweder in perfmon unter Allgemeine Statistiken -> Logische Verbindungen nachsehen oder die Werte in abfragen sys.dm_os_performance_counters(cntr_value zeigt den aktuellen Zeitpunkt an):

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

Ja, ich habe bereits die Benutzerverbindungen überprüft (es ist das erste, was ich besuchte und das am einfachsten zu findende in der Benutzeroberfläche und in der Dokumentation von Microsoft. Ich habe auch meinen Code durchgesehen und die Anzahl der logischen Verbindungen über SSMS von im Auge behalten Mit SP_WHO2, das eine anständige Menge an Informationen über die logischen Verbindungen liefert. Im Leerlauf hat mein Server 51 Verbindungen. Wenn das Skript fehlschlägt, hat es 100 weitere Verbindungen aufgebaut. So bin ich zu meinem derzeitigen Standort gekommen.
Sean Long

Ich habe meine Frage mit meinen Schritten etwas klarer formuliert. Möglicherweise handelt es sich überhaupt nicht um eine SQL-Einstellung. Aus diesem Grund habe ich angefangen, die Windows- und Visual Studio-Einstellungen zu untersuchen.
Sean Long

1
Wenn Sie das alles überprüft haben und es bei 100 Verbindungen immer noch fehlschlägt, liegt die Antwort außerhalb der Datenbankeinstellungen. Zu Ihrer Information, diese 51 Verbindungen sind alle Systemprozesse (+1 für Sie selbst).
Mike Fal

Nur um den Schluss zu ziehen, war dieser letzte Kommentar korrekt. Ich habe mir genauer angesehen, warum diese 100 Verbindungen erstellt wurden und habe eine Lücke im Code gefunden. Nach der Behebung, dass es gut funktioniert. Die oben genannten Informationen sind jedoch immer noch sehr nützlich, und ich hoffe, dass auch andere sie nützlich finden.
Sean Long

25

Geben Sie in Ihrer Verbindungszeichenfolge an max pool size=<your desired max pool size>. Wenn Sie also die maximale Poolgröße auf den Wert 500 ändern möchten, könnte Ihre Verbindungszeichenfolge folgendermaßen aussehen:

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

Natürlich gehe ich bei Ihren anderen Parametern von so viel aus, aber dies sollte Ihnen eine gute Vorstellung davon geben, wie Sie vorgehen sollen. Beim Verbindungspooling handelt es sich um die Durchsetzung des clientseitigen Anbieters. Der Client muss diese Einstellung für die maximale Poolgröße über die Verbindungszeichenfolge angeben.

Stellen Sie außerdem sicher, dass Sie Ihre Verbindungen ordnungsgemäß schließen oder entsorgen, da Sie sonst Verbindungen herstellen. So etwas wie dieses (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
    }
}

Der usingBlock (in C #) ruft IDisposable.Dispose()nach Beendigung auf. Du könntest das auch umsetzenSqlConnection.Dispose() oder SqlConnection.Close()in den finallyBlock eines try/catch/finallyBlocks .

Referenz: MSDN-Dokumentation zur Eigenschaft SqlConnection.ConnectionString


Hier ist die Verbindungszeichenfolge, die auch meine Frage aktualisiert. Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000
Sean Long

3
Ist das dein Verbindungsstring überall ? Der Grund, den ich frage, ist, weil unterschiedliche Verbindungszeichenfolgen unterschiedliche Verbindungspools sein werden.
Thomas Stringer

Das ist eine sehr sehr gute Frage. Ich habe bis jetzt 3 Verbindungszeichenfolgen überprüft, aber alle drängen auf einen Pool mit maximaler Anzahl. Ich werde sehen, ob ich eine andere Zeichenfolge finden kann, die es verursachen könnte.
Sean Long

Wenn Sie nur die Ausführung debuggen, sollten Sie in der Lage sein, den Laufzeitwert SqlConnection.ConnectionStringfür die jeweilige Operation zu ermitteln. Das wäre der einfachste Weg. Wenn max pool sizenicht, dann sind es 100.
Thomas Stringer

1
Dies sollte als akzeptierte Antwort markiert werden, da es das OP tatsächlich korrekt beantwortet. Er erwähnt sowohl den Parameter Max Pool Size der Client-Verbindungszeichenfolge als auch die Notwendigkeit, Verbindungen zu schließen / zu entsorgen.
Adam Caviness
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.