2011-09-05 18 views
7

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?

+1

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 –

+0

http://stackoverflow.com/questions/211355/parameter- sniffing-or-spoofing-in-sql-server cũng khá tốt. –

+1

+1 cho "Tôi biết tôi biết" :) – AakashM

Trả lời

0

Tôi hoàn nguyên về vanila ADO và nhận được cùng một ngoại lệ, vì vậy câu trả lời phải là "không có nó không phải là lỗi LINQ to SQL". Tôi cũng tái cấu trúc SP cho mỗi thông số sniffing bài viết và nó đã không giúp đỡ. Khi mã đã bắt đầu hoạt động trở lại, tôi chỉ có thể tưởng tượng rằng đây là một vấn đề hệ thống tạm thời hoặc trục trặc cơ sở dữ liệu. Vì lợi ích của những người khác có vấn đề tương tự và tìm câu hỏi này bằng cách tìm kiếm sau này, tôi sẽ cập nhật thêm nếu tôi tìm thấy bất kỳ điều gì khác, vì đồng nghiệp sẽ sớm kiểm tra mã trên hệ thống khác.

EDIT: Đó là sự cố hệ thống; cụ thể, đĩa VMWare của tôi cần chống phân mảnh.

(Theo lời khuyên về meta, tôi nên đăng câu trả lời của riêng mình thay vì cập nhật câu hỏi).

+0

Bạn có bất kỳ mệnh đề 'IF' nào trong SQL SP không? Tôi đã lưu ý đôi khi báo cáo SQL 1 kết quả thiết lập, và đôi khi nhiều hơn nữa. Tôi sẽ thử tìm mã mà tôi đã sử dụng để xác định điều này. – leppie

+0

Thử chạy 'exec sys.sp_procedure_params_rowset 'yoursp'' một vài lần và xem đầu ra có giữ nguyên không. – leppie

+0

Có, có một số mệnh đề IF. –

0

LINQ-to-SQL sử dụng vanilla ADO.NET dưới bìa. Ít nhất là như ADO.NET và SQL Server có liên quan, bạn không phải bất cứ nơi nào gần để tối đa số lượng các tham số mà họ có thể xử lý. LINQ-to-SQL được lưu trữ rất thân thiện với thủ tục, miễn là proc được lưu trữ không làm bất cứ điều gì khủng khiếp như tạo SQL động bên trong proc, hoặc trả về kết quả từ các bảng tạm thời.

Bạn đang tạo bản đồ Linq-to-SQL của mình cho proc được lưu trữ như thế nào? Có một công cụ dòng lệnh trong SDK của Visual Studio được gọi là "SQLMETAL" tạo ra .dbml và .cs và, nếu được chỉ định bởi một công tắc dòng lệnh, cũng sẽ ánh xạ các thủ tục được lưu trữ. Nó phân tích đủ các thủ tục lưu trữ để xác minh rằng LINQ to SQL sẽ xử lý chúng, và sẽ cung cấp cho bạn các thông báo lỗi cho các procs được lưu trữ không đáp ứng các tiêu chuẩn của nó. Hãy thử chạy SQLMETAL và xem loại thư bạn nhận được.

+0

Cảm ơn Cylon. Tôi biết rằng vanilla ADO được sử dụng dưới nắp (thực sự là ngoại lệ tôi thấy là một ngoại lệ ADO) nhưng không biết rằng SqlMetal cho đầu ra hữu ích vì vậy tôi sẽ cố gắng đó. Để trả lời câu hỏi của bạn, tôi tạo dbml bằng cách kéo và thả thủ tục được lưu trữ từ trình thám hiểm máy chủ vào sơ đồ ngữ cảnh dữ liệu trong Visual Studio 2010. –

+0

Tôi đã luôn tìm thấy SqlMetal là một công cụ tốt hơn so với kéo-và- thả công cụ trực quan (mà tôi coi là demo-ware, không phải là chất lượng sản xuất).Linq-to-SQL có những ràng buộc nhất định đối với các thủ tục được lưu trữ, và tôi biết rằng SqlMetal kiểm tra chúng. –

+0

Đã thử rằng, chỉ một cảnh báo từ một đối tượng db không liên quan. –

1

Tôi sẽ giả định rằng bạn đã cố gắng tăng thời gian cho bạn về bối cảnh dữ liệu LINQ, như bạn đã đề cập rằng hầu hết các bài đăng mà bạn đã tìm thấy đã gợi ý điều đó.

Tuy nhiên ...

gì các chuyến đi có rất nhiều người lên trong những trường hợp như thế này là máy chủ web, đặc biệt là nếu bạn chạy này trên IIS7.

Iv'e có trường hợp trong quá khứ mà tôi đã bỏ ra hàng giờ để tìm ra nơi mọi thứ đang hết thời gian, chỉ để khắc phục nó trong năm giây bằng cách thay đổi giá trị thời gian cho ứng dụng máy chủ trong IIS7 bảng điều khiển.

Tôi không nói điều này chắc chắn là vấn đề của bạn, nhưng nếu bạn chỉ có máy chủ web được đặt là 30 giây (Đây là mặc định), bạn có thể ngồi và thay đổi thời gian trong ngữ cảnh dữ liệu cả ngày. sẽ không bao giờ nhận được bất cứ nơi nào.

Nếu bạn muốn thử, hãy đăng nhập vào máy mà máy chủ web đang chạy, mở rộng máy chủ/trang web trong ngăn bên trái để xem chi tiết ứng dụng mà proc được lưu trữ của bạn được chạy.

Tại thời điểm này, bạn có một vài nơi để xem. Nếu bạn quay trở lại trang web cấp EG: "Trang Web mặc định" và nhấp vào đó, sau đó nhấp vào cài đặt nâng cao ở bên phải và mở rộng giới hạn kết nối, bạn có thể đặt số giây cho toàn bộ trang web trong đó.

Nếu bạn gọi SP của mình từ tệp ASP cổ điển, hãy nhấp vào webapp của bạn và nhấp đúp vào biểu tượng ASP trong ngăn giữa, mở rộng "Giới hạn thuộc tính" và thay đổi giá trị thời gian của tập lệnh cho phù hợp.

Cuối cùng, nếu bạn làm điều này bằng cách sử dụng một số loại hoạt động CGI, hãy nhấp vào ứng dụng web của bạn, sau đó nhấp đúp vào CGI và thay đổi thời gian trong đó.

Cuối cùng nhưng không kém phần quan nếu không có sự giúp đỡ trên, bạn có thể thử thêm đoạn mã XML sau đây để web.config tập tin ứng dụng của bạn ở nơi thích hợp, để kiểm soát thời gian thực hiện kịch bản .NET ra:

<system.web> 
     <httpRuntime executionTimeout="180"/> 
    <\system.web> 

Nếu bạn không chạy trên IIS7 thì bạn sẽ cần phải nhìn vào những gì bao giờ bảng điều khiển máy chủ của bạn sử dụng cho các thiết lập tương tự.

+0

Cảm ơn bạn đã trả lời câu trả lời chi tiết nhưng tiếc là IIS không phải là một phần của phương trình này. Đó là một dịch vụ Windows. –

Các vấn đề liên quan