Korzystam z .NET Framework 4.0, C# i SQL Server 2008 R2 w systemie Windows Server 2008 R2. Mój kontekst danych LINQ do SQL znajduje się w osobnej bibliotece, a dany kod działa w usłudze Windows.Czy istnieje błąd lub ograniczenie w LINQ do SQL, które spowodowałoby, że procedura przechowywana do limitu czasu?
Mam przetestowaną, krytyczną dla operacji procedurę przechowywaną, która pobiera 19 parametrów (wiem, że wiem), wykonuje proste logiki "if" i buduje kilka zmiennych oraz wstawia dane do 3 tabel. Nie używa kursorów ani tabel tymczasowych. Opisałem, co robi SP, ponieważ nie mam prawa publikować kodu SQL.
Widzę wiele postów w Internecie o SqlException z powodu timeout polecenia, a odpowiedzi rzadko wykraczają poza "zwiększyć timeout polecenia". Example
Otrzymałem powyższy wyjątek, więc próbowałem zwiększyć limit czasu polecenia podczas tworzenia kontekstu danych do 10 minut. Nadal mam wyjątek po tym, jak siedział tam i czekał na te 10 minut. Następnie dodałem kilka protokołów debugowania, aby przechwycić dane wyjściowe z LINQ do SQL i uruchomiłem SP w SQL Server Management Studio z tymi samymi wartościami parametrów. Pomyślnie zakończyła się w ułamku sekundy drugiej.
Oto LINQ to SQL wyjście Log (limity czasu z powrotem na domyślne) miesza się z jakiegoś innego wyjścia dziennika, mam ukrywane nazwy SP w tym poście:
16:01:37 15269 Irrelevant log line, deleted for StackOverflow
EXEC @RETURN_VALUE = [dbo].[NAMEHIDDENONSTACKOVERFLOW] @Eastings = @p0, @Northings = @p1, @Speed = @p2, @UpdateDate = @p3, @UserId = @p4, @Postion = @p5, @Direction = @p6, @VehicleId = @p7, @Status = @p8, @Confidence = @p9, @Latitude = @p10, @Longitude = @p11, @PosLatitude = @p12, @PosLongitude = @p13, @WatchBoxId = @p14, @LastWatchBoxId = @p15, @WatchBoxIdAlert = @p16, @ImbolizationState = @p17, @TowAwayAlertState = @p18
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [560120]
-- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [5754714]
-- @p2: Input Int (Size = -1; Prec = 0; Scale = 0) [0]
-- @p3: Input DateTime (Size = -1; Prec = 0; Scale = 0) [02/08/2011 20:45:08]
-- @p4: Input Int (Size = -1; Prec = 0; Scale = 0) [11]
-- @p5: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [Swindon United Kingdom]
-- @p6: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [5]
-- @p7: Input Int (Size = -1; Prec = 0; Scale = 0) [15269]
-- @p8: Input Int (Size = -1; Prec = 0; Scale = 0) [901]
-- @p9: Input Int (Size = -1; Prec = 0; Scale = 0) [0]
-- @p10: Input Float (Size = -1; Prec = 0; Scale = 0) [51.939899]
-- @p11: Input Float (Size = -1; Prec = 0; Scale = 0) [-2.125414]
-- @p12: Input Float (Size = -1; Prec = 0; Scale = 0) [51.9333333]
-- @p13: Input Float (Size = -1; Prec = 0; Scale = 0) [-2.1]
-- @p14: Input Int (Size = -1; Prec = 0; Scale = 0) [-1]
-- @p15: Input Int (Size = -1; Prec = 0; Scale = 0) [-1]
-- @p16: Input Int (Size = -1; Prec = 0; Scale = 0) [0]
-- @p17: Input Int (Size = -1; Prec = 0; Scale = 0) [0]
-- @p18: Input Int (Size = -1; Prec = 0; Scale = 0) [0]
-- @RETURN_VALUE: Output Int (Size = -1; Prec = 0; Scale = 0) [Null]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1
16:02:23 0 Error in DoPoll 1 Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
jedyną wskazówką, że jestem pobieranie z przeszukiwania Stack Overflow polega na tym, że może wystąpić problem z czymś, co nazywa się "sniffingiem parametrów", ale wciąż czytam o tym, aby ustalić, o co chodzi.
To jest naprawdę krytyczna sprawa, a ja dostanę wiele kłopotów, jeśli nie uda się jej produkcji, więc mam ochotę wycofać LINQ i wrócić do waniliowej ADO. Moje pytanie brzmi: czy coś jest nie tak z moim podejściem (inaczej: czy jestem idiotą?) Czy jest jakiś problem lub błąd w LINQ do SQL, który może być przyczyną tego problemu? Czy jest coś, co mogę zrobić, aby rozwiązać ten problem, czy lepiej powrócić do waniliowej ADO?
Kilka rzeczy do wypróbowania, jeśli chodzi o sniffowanie parametrów: http://elegantcode.com/2008/05/17/sql-parameter-sniffing-and-what-to-do-about-it/ i http: //stackoverflow.com/questions/6986607/a-5sec-sp-hitting-a-30sec-timeout-through-linq-to-sql/6986902#6986902 –
http://stackoverflow.com/questions/211355/parameter- Sniffing-or-spoofing-in-sql-server jest całkiem niezły. –
+1 za "Wiem, że wiem" :) – AakashM