Czy mogę zwiększyć limit czasu, modyfikując parametry połączenia w pliku web.config
?
Czy mogę zwiększyć limit czasu, modyfikując parametry połączenia w pliku web.config
?
Odpowiedzi:
Tak, możesz dołączyć ;Connection Timeout=30
do parametrów połączenia i określić żądaną wartość.
Wartość limitu czasu ustawiona we Connection Timeout
wł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ść.
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:
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.
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.
Ciąg połączenia 2: Jeśli podasz nazwę serwera niepoprawnie lub niekompletnie (na przykład mysqlserver
zamiast 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ń?
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.
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.
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:
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.
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.
Uruchom zapytanie w Management Studio i zobacz, ile to trwa.
Powodzenia!
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);
ConnectionTimeout
właściwości SqlConnection
typu tylko do odczytu uznano za dobry pomysł.