Tôi đang sử dụng .NET Framework 4.0, C# và SQL Server 2008 R2 trên Windows Server 2008 R2. Ngữ cảnh dữ liệu LINQ to SQL của tôi nằm trong một thư viện riêng biệt và mã đang được đề cập đang chạy trong một dịch vụ Windows.Có lỗi hoặc giới hạn trong LINQ to SQL có thể gây ra các thủ tục được lưu trữ để hết thời gian chờ không?
Tôi có một thủ tục được lưu trữ cẩn thận, nhiệm vụ quan trọng, có 19 tham số (tôi biết), thực hiện một số logic "if" đơn giản và xây dựng một vài biến và chèn dữ liệu vào 3 bảng. Nó không sử dụng con trỏ hoặc bảng tạm thời. Tôi đã mô tả những gì SP làm như tôi không tự do để đăng các mã sql.
Tôi thấy nhiều bài đăng trên internet về SqlException do thời gian chờ của lệnh và các câu trả lời hiếm khi vượt quá "tăng thời gian chờ của lệnh". Example
Tôi đã nhận được ngoại lệ nói trên nên đã cố gắng tăng thời gian chờ của lệnh khi tạo ngữ cảnh dữ liệu thành 10 phút. Tôi vẫn nhận được ngoại lệ sau khi nó ngồi đó chờ đợi trong 10 phút đó. Sau đó tôi thêm một số đăng nhập gỡ lỗi để nắm bắt đầu ra từ LINQ to SQL và chạy SP trong phòng thu SQL Server Management với các giá trị tham số tương tự. Nó hoàn thành thành công trong một phần của một giây thứ hai.
Đây là LINQ to SQL Log đầu ra (với timeouts lại mặc định) trộn lẫn với một số dữ liệu ghi nhận khác, tôi đã obfuscated tên SP trong bài viết này:
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.
Các đầu mối duy nhất tôi nhận được từ tìm kiếm Stack Overflow là có thể có một vấn đề với một cái gì đó gọi là "tham số sniffing", nhưng tôi vẫn đọc lên trên đó để làm việc ra những gì nó về.
Đây thực sự là công cụ quan trọng và tôi sẽ gặp rất nhiều rắc rối nếu nó không hoạt động, vì vậy tôi bị cám dỗ để quay trở lại LINQ và quay trở lại vanilla ADO. Câu hỏi của tôi là: Có gì sai với cách tiếp cận của tôi (đặt một cách khác: tôi là một thằng ngốc?) Hoặc là có một số vấn đề hoặc lỗi trong LINQ to SQL có thể gây ra vấn đề này? Có bất cứ điều gì tôi có thể làm để khắc phục sự cố này hay nó sẽ tốt hơn để trở lại vani ADO?
Một vài điều cần thử, nếu đó là thông số đánh hơi: http://elegantcode.com/2008/05/17/sql-parameter-sniffing-and-what-to-do-about-it/ và 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 cũng khá tốt. –
+1 cho "Tôi biết tôi biết" :) – AakashM