2010-12-09 18 views
8

estamos utilizando .NET 4 MVC2 con EF & SQL Server 2005.Excepción SQL con .NET 4 y EF

Para algunas solicitudes, y sucede raramente, y sólo cuando estamos haciendo de búsqueda que se implementa con las clases asignada a los procedimientos almacenados que realizan la búsqueda de texto completo, obtenemos la excepción:

[SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.] 
    System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +2030802 
    System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +5009584 
    System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() +234 
    System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2275 
    System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +33 
    System.Data.SqlClient.SqlDataReader.get_MetaData() +86 
    System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +311 
    System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +987 
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162 
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32 
    System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141 
    System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12 
    System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) +10 
    System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +443 

[EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details.] 
    System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +479 
    System.Data.Objects.ObjectContext.CreateFunctionObjectResult(EntityCommand entityCommand, EntitySet entitySet, EdmType edmType, MergeOption mergeOption) +182 
    System.Data.Objects.ObjectContext.ExecuteFunction(String functionName, MergeOption mergeOption, ObjectParameter[] parameters) +218 
    System.Data.Objects.ObjectContext.ExecuteFunction(String functionName, ObjectParameter[] parameters) +53 

Si la búsqueda se vuelve a intentar después de un error (con igual o diferente duración), que funciona con regularidad.

Cualquier sugerencia bien apreciados

Gracias

--MB

PENSAMIENTO 1: La excepción parece ocurrir después de que se realiza la conexión al servidor SQL, y mientras se está ejecutando el procedimiento almacenado, ¿Estoy en lo correcto? Si este es el caso, entonces necesitaría extender el tiempo de espera de la ejecución de la consulta y no el tiempo de espera de la conexión? ¿Es esto posible? ¿Dónde?

PENSAMIENTO 2: ¿Quizás estoy equivocado y esto podría ser una conexión obsoleta en la piscina? En Java World, ¿puede pasar el sql que se ejecuta en la conexión antes de que la aplicación lo obtenga para asegurarse de que la conexión esté abierta y en funcionamiento? Podría estar causando esto. No he sido capaz de localizar dicha opción dentro http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx

PENSAMIENTO 3: Estoy perdido :)

Respuesta

14

Usted puede intentar establecer la propiedad ObjectContext.CommandTimeout:

Obtiene o establece el valor de tiempo de espera, en segundos, para todas las operaciones de contexto objeto. Un valor nulo indica que se usará el valor predeterminado del proveedor subyacente.

1

Sí, intente aumentar el tiempo de espera de conexión, que está en web.config:

<connectionStrings> 
    <add name="AdventureWorksEntities" 
     connectionString="metadata=.\AdventureWorks.csdl|.\AdventureWorks.ssdl|.\AdventureWorks.msl; 
     provider=System.Data.SqlClient;provider connection string='Data Source=localhost; 
     Initial Catalog=AdventureWorks;Integrated Security=True;**Connection Timeout=60;** 
     multipleactiveresultsets=true'" providerName="System.Data.EntityClient" /> 
</connectionStrings> 

Además, ¿realmente ha intentado ver cuánto tarda el SPROC en ejecutarse cuando lo ejecuta manualmente?

+4

En cuanto a la propiedad de Connect Timeout, como he dicho, no creo que esto sea un problema. El MSN declara: "La cantidad de tiempo (en segundos) para esperar una conexión al servidor antes de terminar el intento y generar un error". Pero la excepción parece estar sucediendo NO mientras espera la conexión al servidor, pero mientras espera la ejecución de la consulta. Arent estas 2 cosas diferentes? No creo que el problema sea el tiempo de ejecución de SPROC, porque después de la excepción, cuando intento hacer una búsqueda en otro término, todo funciona bien. De todos modos, muchas gracias por la respuesta, voy a probarlo. –

1

Estaba usando EF 4.3.1, SQL 2008 y tenía el mismo problema con una consulta de EF linq que tardaba más de los 30 segundos predeterminados.

Así que establecí el "Tiempo de espera de conexión = 120;" en la cadena de conexión.

A continuación, anule el constructor de DbContext y configure todos los tiempos de espera de comando para utilizar el tiempo de espera de conexión de la cadena de conexión;

public class FooContext : DbContext 
{ 
    public FooContext() 
    { 
     // Set all commands to use the connection timeout from the connection string 
     SetCommandTimeout(this.Database.Connection.ConnectionTimeout); 
    } 

    public void SetCommandTimeout(int timeout) 
    { 
     // Get the ObjectContext related to this DbContext 
     var objectContext = (this as IObjectContextAdapter).ObjectContext; 
     objectContext.CommandTimeout = this.Database.Connection.ConnectionTimeout;    
    } 
} 

Si sólo desea aumentar el tiempo de espera en determinadas consultas, a continuación, quitar el constructor y se establece como sea necesario;

var db = new FooContext(); 
db.SetCommandTimeout(120); 
db.Bars.ToList(); 
Cuestiones relacionadas