Limit czasu połączenia z serwerem SQL

109

Czy mogę zwiększyć limit czasu, modyfikując parametry połączenia w pliku web.config?

zachary
źródło
7
Nie czytaj tego tak, jak myślałem, że limit czasu będzie kontrolował wykonanie zapytania - tak nie jest, tylko limit czasu połączenia z serwerem - „limit czasu połączenia” byłby lepszą nazwą. Zobacz stackoverflow.com/a/7976867/409856
downwitch

Odpowiedzi:

213

Tak, możesz dołączyć ;Connection Timeout=30do parametrów połączenia i określić żądaną wartość.

Wartość limitu czasu ustawiona we Connection Timeoutwłaściwości to czas wyrażony w sekundach . Jeśli ta właściwość nie jest ustawiona, wartość limitu czasu dla połączenia jest wartością domyślną (15 sekund).

Ponadto, ustawiając wartość limitu czasu na 0, określasz, że twoja próba połączenia czeka nieskończony czas. Jak opisano w dokumentacji, jest to coś, czego nie należy ustawiać w parametrach połączenia:

Wartość 0 oznacza brak limitu i należy jej unikać w ConnectionString, ponieważ próba nawiązania połączenia czeka w nieskończoność.

Darin Dimitrov
źródło
Czy możesz podać na to przykład? Używam EF6 mam 3 mln dane w moim stole, kiedy zrobić kilka program powraca proces wygaszania błędu ... uwaga: Używam indeksowanie w tabeli
saulyasar
4
@saulyasar To jest limit czasu POŁĄCZENIA, a nie limit czasu polecenia. Limit czasu POŁĄCZENIA dotyczy tego, jak długo będzie próbował nawiązać połączenie z serwerem sql. Chcesz zbadać limit czasu polecenia COMMAND, czyli jak długo procedura lub instrukcja będzie działać przed upływem limitu czasu.
granadaCoder
32

Hmmm...

Jak powiedział Darin, możesz określić wyższą wartość limitu czasu połączenia, ale wątpię, że to naprawdę problem.

Po przekroczeniu limitu czasu połączenia jest to zazwyczaj problem z jedną z następujących przyczyn:

  1. Konfiguracja sieci - wolne połączenie między serwerem WWW / dev box a serwerem SQL. Zwiększenie limitu czasu może to naprawić, ale dobrze byłoby zbadać podstawowy problem.

  2. Ciąg połączenia. Widziałem problemy, w wyniku których niepoprawna nazwa użytkownika / hasło z jakiegoś powodu powodowały wyświetlenie błędu przekroczenia limitu czasu zamiast rzeczywistego błędu wskazującego „odmowa dostępu”. To nie powinno się zdarzyć, ale takie jest życie.

  3. Ciąg połączenia 2: Jeśli podasz nazwę serwera niepoprawnie lub niekompletnie (na przykład mysqlserverzamiast mysqlserver.webdomain.com), otrzymasz limit czasu. Czy możesz pingować serwer, używając nazwy serwera dokładnie takiej, jak określona w parametrach połączenia w wierszu poleceń?

  4. Ciąg połączenia 3: Jeśli nazwa serwera znajduje się w Twoim DNS (lub pliku hostów), ale wskazuje na niepoprawny lub niedostępny adres IP, otrzymasz limit czasu zamiast błędu nieznalezienia maszyny.

  5. Zapytanie, do którego dzwonisz, wygasło. Może się wydawać, że problem stanowi połączenie z serwerem, ale w zależności od struktury aplikacji można doprowadzić do etapu, na którym zapytanie jest wykonywane przed upływem limitu czasu.

  6. Przecieki połączenia. Ile procesów jest uruchomionych? Ile otwartych połączeń? Nie jestem pewien, czy surowy ADO.NET wykonuje pule połączeń, automatycznie zamyka połączenia, gdy jest to konieczne, np. Enterprise Library lub gdzie wszystko jest skonfigurowane. To prawdopodobnie czerwony śledź. Jednak podczas pracy z usługami WCF i usługami internetowymi miałem problemy z niezamkniętymi połączeniami powodującymi przekroczenia limitów czasu i inne nieprzewidywalne zachowanie.

Rzeczy do wypróbowania:

  1. Czy podczas łączenia się z serwerem za pomocą programu SQL Management Studio występuje przekroczenie limitu czasu? Jeśli tak, prawdopodobnie problem stanowi konfiguracja sieciowa. Jeśli nie widzisz problemu podczas łączenia się z Management Studio, problem będzie dotyczył Twojej aplikacji, a nie serwera.

  2. Uruchom program SQL Profiler i zobacz, co się właściwie dzieje. Powinieneś być w stanie stwierdzić, czy naprawdę się łączysz, czy też problem stanowi zapytanie.

  3. Uruchom zapytanie w Management Studio i zobacz, ile to trwa.

Powodzenia!

3Dave
źródło
jeśli twoje zapytanie wygasa, myślę, że otrzymasz limit czasu polecenia
user55474
prawdopodobnie @ user55474; zależy ( bardzo rzadko) od tego, jak to się nazywa.
Zapisz
Nie według tego posta na blogu msdn: blogs.msdn.com/b/spike/archive/2008/07/31/…
tom redfern
@hugh Myślę, że powiedziałem, że to rzadkie, ale widziałem to z pierwszej ręki.
Zapisz
1
+1 dla „Uruchom SQL Profiler”. Wygląda na to, że będzie to skomplikowane, ale w rzeczywistości wystarczy kliknąć „Narzędzia> SQL Server Profiler” i obserwować, co Twoja aplikacja mówi do SQL Server. Okazuje się, że moja była opcją nr 5 :)
Andrew Kvochick
11

Jeśli chcesz to dynamicznie zmieniać, wolę używać SqlConnectionStringBuilder .

Pozwala na konwersję ConnectionString, czyli ciągu znaków do klasy Object, Wszystkie właściwości parametrów połączenia staną się jego składnikiem.

W takim przypadku prawdziwą zaletą byłoby to, że nie musisz się martwić, czy część ciągu ConnectionTimeout już istnieje w parametrach połączenia, czy nie?

Również gdy tworzy obiekt i zawsze dobrze jest przypisać wartość w obiekcie, zamiast manipulować łańcuchem.

Oto przykładowy kod:

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

sscsb.ConnectTimeout = 30;

var conn = new SqlConnection(sscsb.ConnectionString);
Imran Rizvi
źródło
2
Nie mogę uwierzyć, że uczynienie ConnectionTimeoutwłaściwości SqlConnectiontypu tylko do odczytu uznano za dobry pomysł.
Maslow