Verbindungszeitlimit für SQL Server

109

Kann ich das Zeitlimit erhöhen, indem ich die Verbindungszeichenfolge in der web.configändern?

Zachary
quelle
7
Lesen Sie dies nicht so, als hätte ich gedacht, dass das Zeitlimit die Ausführung von Abfragen steuern würde - nicht nur das Zeitlimit für die Verbindung zum Server - "Verbindungszeitlimit" wäre ein besserer Name. Siehe stackoverflow.com/a/7976867/409856
Downwitch

Antworten:

213

Ja, Sie können ;Connection Timeout=30an Ihre Verbindungszeichenfolge anhängen und den gewünschten Wert angeben.

Der in der Connection TimeoutEigenschaft festgelegte Zeitlimitwert ist eine in Sekunden ausgedrückte Zeit . Wenn diese Eigenschaft nicht festgelegt ist, ist der Zeitlimitwert für die Verbindung der Standardwert (15 Sekunden).

Wenn Sie den Timeout-Wert auf festlegen 0, geben Sie außerdem an, dass Ihr Verbindungsversuch unendlich lange wartet. Wie in der Dokumentation beschrieben, sollten Sie dies nicht in Ihrer Verbindungszeichenfolge festlegen:

Der Wert 0 gibt keine Begrenzung an und sollte in einem ConnectionString vermieden werden, da ein Verbindungsversuch auf unbestimmte Zeit wartet.

Darin Dimitrov
quelle
4
Ist diese Zeitüberschreitung in Minuten oder Sekunden?
Benutzer1
1
@ user1 "Die Zeitspanne (in Sekunden), die auf eine Verbindung zum Server gewartet werden muss, bevor der Versuch abgebrochen und ein Fehler generiert wird."
Santux
5
Zu Ihrer Information: Das Verbindungszeitlimit = 0 ist unendlich.
Abdul Saboor
Können Sie ein Beispiel dafür geben? Ich verwende EF6 und ich habe 3 Millionen Daten in meiner Tabelle, wenn ich ein Prozessprogramm mache, das einen Timeout-Fehler zurückgibt ... Hinweis: Ich verwende die Indizierung in der Tabelle
saulyasar
4
@saulyasar Dies ist das Verbindungs-Timeout, nicht das COMMAND-Timeout. Das Zeitlimit für die Verbindung gibt an, wie lange versucht wird, eine Verbindung zum SQL Server herzustellen. Sie möchten das COMMAND-Timeout untersuchen, dh wie lange eine Prozedur oder Anweisung ausgeführt wird, bevor das Zeitlimit überschritten wird.
GranadaCoder
32

Hmmm...

Wie Darin sagte, können Sie einen höheren Wert für das Verbindungszeitlimit angeben, aber ich bezweifle, dass dies wirklich das Problem ist.

Wenn Verbindungszeitüberschreitungen auftreten, tritt normalerweise ein Problem mit einem der folgenden Probleme auf:

  1. Netzwerkkonfiguration - langsame Verbindung zwischen Ihrem Webserver / Ihrer Entwicklungsbox und dem SQL Server. Durch Erhöhen des Zeitlimits kann dies möglicherweise behoben werden. Es ist jedoch ratsam, das zugrunde liegende Problem zu untersuchen.

  2. Verbindungszeichenfolge. Ich habe Probleme gesehen, bei denen ein falscher Benutzername / ein falsches Passwort aus irgendeinem Grund einen Timeout-Fehler anstelle eines echten Fehlers anzeigt, der "Zugriff verweigert" anzeigt. Das sollte nicht passieren, aber so ist das Leben.

  3. Verbindungszeichenfolge 2: Wenn Sie den Namen des Servers falsch oder unvollständig angeben (z. B. mysqlserveranstelle von mysqlserver.webdomain.com), wird eine Zeitüberschreitung angezeigt. Können Sie den Server mit dem Servernamen genau so anpingen , wie in der Verbindungszeichenfolge in der Befehlszeile angegeben?

  4. Verbindungszeichenfolge 3: Wenn sich der Servername in Ihrem DNS (oder Ihrer Hosts-Datei) befindet, aber auf eine falsche oder unzugängliche IP verweist, wird eher eine Zeitüberschreitung als ein Fehler angezeigt, bei dem der Computer nicht gefunden wurde.

  5. Die Abfrage, die Sie anrufen, läuft ab. Es kann so aussehen, als ob die Verbindung zum Server das Problem ist. Abhängig von der Struktur Ihrer App können Sie es jedoch bis zu dem Stadium schaffen, in dem Ihre Abfrage ausgeführt wird, bevor das Zeitlimit auftritt.

  6. Verbindung leckt. Wie viele Prozesse laufen? Wie viele offene Verbindungen? Ich bin nicht sicher, ob Raw ADO.NET ein Verbindungspooling durchführt, Verbindungen bei Bedarf automatisch in einer Unternehmensbibliothek schließt oder wo alles konfiguriert ist. Dies ist wahrscheinlich ein roter Hering. Bei der Arbeit mit WCF und Webdiensten hatte ich jedoch Probleme mit nicht geschlossenen Verbindungen, die zu Zeitüberschreitungen und anderen unvorhersehbaren Verhaltensweisen führten.

Dinge zu versuchen:

  1. Erhalten Sie eine Zeitüberschreitung, wenn Sie mit SQL Management Studio eine Verbindung zum Server herstellen? In diesem Fall ist wahrscheinlich die Netzwerkkonfiguration das Problem. Wenn beim Herstellen einer Verbindung mit Management Studio kein Problem auftritt, liegt das Problem in Ihrer App und nicht auf dem Server.

  2. Führen Sie SQL Profiler aus und sehen Sie, was tatsächlich über die Leitung läuft. Sie sollten feststellen können, ob Sie wirklich eine Verbindung herstellen oder ob eine Abfrage das Problem ist.

  3. Führen Sie Ihre Abfrage in Management Studio aus und sehen Sie, wie lange es dauert.

Viel Glück!

3Dave
quelle
Wenn Ihre Abfrage abgelaufen ist, erhalten Sie vermutlich eine Befehlszeitüberschreitung
user55474
@ user55474 wahrscheinlich; hängt ( sehr selten) davon ab, wie es heißt.
3Dave
Nicht gemäß diesem MSDN-Blog-Beitrag: blogs.msdn.com/b/spike/archive/2008/07/31/…
Tom Redfern
@hugh Ich glaube, ich sagte, es sei selten, aber ich habe es aus erster Hand gesehen.
3Dave
1
+1 für "SQL Profiler ausführen". Es hört sich so an, als wäre es kompliziert, aber Sie klicken einfach auf "Extras> SQL Server Profiler" und sehen, was Ihre App zu SQL Server sagt. Es stellte sich heraus, dass meine Option 5 war :)
Andrew Kvochick
11

Wenn Sie es dynamisch ändern möchten, bevorzuge ich die Verwendung von SqlConnectionStringBuilder .

Sie können ConnectionString, dh eine Zeichenfolge, in die Klasse Object konvertieren. Alle Eigenschaften der Verbindungszeichenfolge werden zu ihrem Mitglied.

In diesem Fall besteht der eigentliche Vorteil darin, dass Sie sich keine Sorgen machen müssen, ob der ConnectionTimeout-Zeichenfolgenteil bereits in der Verbindungszeichenfolge vorhanden ist oder nicht.

Auch wenn es ein Objekt erstellt und es immer gut ist, einen Wert im Objekt zuzuweisen, anstatt eine Zeichenfolge zu manipulieren.

Hier ist das Codebeispiel:

var sscsb = new SqlConnectionStringBuilder(_dbFactory.Database.ConnectionString);

sscsb.ConnectTimeout = 30;

var conn = new SqlConnection(sscsb.ConnectionString);
Imran Rizvi
quelle
2
Ich kann nicht glauben, dass es eine gute Idee war , die ConnectionTimeoutEigenschaft für den SqlConnectionTyp schreibgeschützt zu machen.
Maslow