2010-12-09 16 views
8

używamy .NET Framework 4 MVC2 EF & SQL Server 2005.SQL Wyjątek Z .net 4 i EF

Dla niektórych wniosków, a zdarza się rzadko i tylko wtedy, gdy robimy przeszukiwanie który jest realizowany z klas odwzorowywane do procedur przechowywanych wykonujących wyszukiwanie pełnotekstowe, otrzymujemy wyjątek:

[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 

Jeżeli wyszukiwanie jest ponowiona po wystąpieniu błędu (z tym samym lub innym okresie), to działa regularnie.

Wszelkie sugestie doceniane

Dzięki

--MB

MYŚL 1: Wyjątkiem wydaje się zdarzyć, po nawiązaniu połączenia z serwerem SQL jest wykonany, a gdy procedura przechowywana jest wykonywany, mam rację? Jeśli tak, to czy powinienem przedłużyć limit czasu wykonywania zapytań, a nie limit czasu połączenia? Czy to możliwe, gdzie?

MYŚLAĆ 2: Być może się mylę i może to być nieczyste połączenie w basenie? W świecie Java można przekazać sql, który jest wykonywany na połączeniu, zanim aplikacja uzyska go, aby upewnić się, że połączenie jest otwarte i działa? To może być przyczyną tego. Nie byłem w stanie znaleźć takiej opcji w ciągu http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx

MYŚLI 3: gubię :)

Odpowiedz

14

Można spróbować ustawić właściwość ObjectContext.CommandTimeout:

Pobiera lub ustawia wartość limitu czasu, w sekundach, dla wszystkich operacji kontekstowych obiektu. Wartość pusta wskazuje, że będzie używana domyślna wartość dostawcy podstawowego.

1

Tak, spróbuj zwiększyć limit czasu połączenia, które jest w pliku 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> 

Czy próbowałeś sprawdzić, ile czasu zajmuje SPROC, aby wykonać go ręcznie?

+4

Jeśli chodzi o właściwość Connect Timeout, tak jak powiedziałem, nie sądzę, że to jest problem. MSN stwierdza: "Czas (w sekundach) oczekiwania na połączenie z serwerem przed zakończeniem próby i wygenerowaniem błędu." Wydaje się jednak, że wyjątek dzieje się NIE podczas oczekiwania na połączenie z serwerem, ale podczas oczekiwania na wykonanie zapytania. Arent te 2 rzeczy różne? Nie sądzę, że problem jest czas wykonania SPROC, ponieważ po wyjątku, gdy próbuję ponownie wyszukać na innym horyzoncie, wszystko działa dobrze. W każdym razie, bardzo dziękuję za odpowiedź, wypróbuję to. –

1

Używałem EF 4.3.1, SQL 2008 i miałem ten sam problem z zapytaniem EF linq trwającym dłużej niż domyślne 30 sekund.

Ustawiam "Limit czasu połączenia = 120;" w ciągu połączenia.

Następnie należy zastąpić konstruktor DbContext i ustawić wszystkie limity czasu polecenia, aby użyć limitu czasu połączenia z ciągu połączenia;

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;    
    } 
} 

Jeśli chcesz tylko zwiększyć limit czasu dla niektórych zapytań, usuń konstruktor i ustaw go zgodnie z wymaganiami;

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