Estoy usando .NET Framework 4.0, C# y SQL Server 2008 R2 en Windows Server 2008 R2. El contexto de datos de mi LINQ to SQL está en una biblioteca separada y el código en cuestión se está ejecutando en un servicio de Windows.¿Existe algún error o limitación en LINQ to SQL que provoque que se agote el tiempo de espera de los procedimientos almacenados?
Tengo un procedimiento almacenado de misión crítica bien probado que requiere unos 19 parámetros (sé que lo sé), realiza una lógica simple "si" y crea algunas variables, e inserta datos en 3 tablas. No utiliza cursores ni tablas temporales. He descrito lo que hace el SP, ya que no estoy en libertad de publicar el código sql.
Estoy viendo muchas publicaciones en Internet sobre SqlException debido al tiempo de espera del comando, y las respuestas rara vez van más allá de "aumentar el tiempo de espera del comando". Example
Estaba recibiendo la excepción antes mencionada, así que intenté aumentar el tiempo de espera del comando al crear el contexto de datos en 10 minutos. Todavía recibo la excepción después de que se haya sentado allí esperando esos 10 minutos. Luego agregué un registro de depuración para capturar el resultado de LINQ a SQL y ejecuté el SP en el estudio de SQL Server Management con los mismos valores de parámetro. Se completó con éxito en una fracción de de un segundo.
Aquí está la LINQ a SQL salida del registro (con tiempos de espera de volver a por defecto) mezclado con alguna otra salida del registro, he ofuscado el nombre de SP en este post:
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.
La única pista que estoy Al salir de la búsqueda Stack Overflow es posible que haya un problema con algo llamado "parámetro sniffing", pero aún estoy leyendo sobre eso para averiguar de qué se trata.
Esto es realmente algo crítico y me costará un montón si falla en la producción, por lo que estoy tentado de retrotraer el LINQ y volver al ADO de vanilla. Mi pregunta es: ¿Hay algo de malo en mi enfoque (dicho de otra manera: ¿estoy siendo un idiota?) O ¿hay algún problema o error en LINQ to SQL que pueda estar causando este problema? ¿Hay algo que pueda hacer para solucionar este problema o sería mejor revertir a ADO vainilla?
Algunas cosas para probar, si se trata de descubrimiento de parámetros: http://elegantcode.com/2008/05/17/sql-parameter-sniffing-and-what-to-do-about-it/ y 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 es bastante bueno también. –
+1 para "Sé que sé" :) – AakashM