2013-01-05 9 views
5

In modo coerente ricevo un errore dal modulo di stato sessione in ASP.NET 4.5 Ruolo Web di Windows Azure che punta a un database SQL Azure. Il modulo dello stato della sessione sta usando dbcontext. L'eccezione incl. stacktrace is:Ricezione coerente di "periodo di timeout trascorso" dal provider di stato sessione (Entity Framework) con SQL Azure

System.Data.EntityException: The underlying provider failed on Open. ---> System.Data.SqlClient.SqlException: Connection Timeout Expired. The timeout period elapsed while attempting to consume the pre-login handshake acknowledgement. This could be because the pre-login handshake failed or the server was unable to respond back in time. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=2; handshake=14993; ---> System.ComponentModel.Win32Exception: The wait operation timed out 
--- End of inner exception stack trace --- 
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 
at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) 
at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync() 
at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket() 
at System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean& marsCapable) 
at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover) 
at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) 
at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) 
at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) 
at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions) 
at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) 
at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) 
at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnectionOptions userOptions) 
at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnectionOptions userOptions) 
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) 
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) 
at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) 
at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) 
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) 
at System.Data.SqlClient.SqlConnection.Open() 
at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure) 
--- End of inner exception stack trace --- 
at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure) 
at System.Data.EntityClient.EntityConnection.Open() 
at System.Data.Objects.ObjectContext.EnsureConnection() 
at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) 
at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() 
at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source) 
at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source) 
at System.Data.Entity.Internal.Linq.InternalSet`1.FindInStore(WrappedEntityKey key, String keyValuesParamName) 
at System.Data.Entity.Internal.Linq.InternalSet`1.Find(Object[] keyValues) 
at System.Web.Providers.DefaultSessionStateProvider.<>c__DisplayClass14.<SetAndReleaseItemExclusive>b__13() 
at Microsoft.Practices.TransientFaultHandling.RetryPolicy.<>c__DisplayClass1.<ExecuteAction>b__0() 
at Microsoft.Practices.TransientFaultHandling.RetryPolicy.ExecuteAction[TResult](Func`1 func) 
at System.Web.SessionState.SessionStateModule.OnReleaseState(Object source, EventArgs eventArgs) 
at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

Potete aiutarmi con questo problema, per favore?

+0

Hai mai trovato una risposta a questo? Sembra che scommetto di averlo anche solo occasionalmente. – dreza

+0

Forse un algoritmo retry-delay come: http://stackoverflow.com/questions/17215377/connection-timeout-in-sql-azure –

risposta

0

SQL Azure fornisce risorse limitate poiché ciascun database risiede in server condivisi, ovvero se un altro client esegue query lunghe nello stesso server in cui si sta lavorando, le prestazioni dell'applicazione diminuiranno.

Nella mia esperienza di due anni con SQL Azure, è necessario implementare alcuni tentativi di logica nel DAL in modo che l'applicazione eviti arresti anomali con questo tipo di errori. Inoltre, ogni database può contenere fino a 180 connessioni simultanee e altre limitazioni (come dimensione, amministrazione, ecc.). Ogni connessione dopo il 180 sarà respinta. Devi proteggere attentamente la tua applicazione dagli attacchi DoS!

Non esiste alcuna opzione (o configurazione) disponibile per gli utenti standar (come voi o me) di SQL Azure per mitigare queste limitazioni (anche nei database Enterprise). Nella mia azienda come team DBA, avevamo aperto diversi ticket con il team Microsoft Ops su molti problemi relativi a elevati carichi transazionali e le raccomandazioni ricevute da loro hanno parlato del partizionamento dei dati su diversi database, indicizzazione, riprova politica e ritardi ritardi (per connessioni/accessi e query) - impostato su 5 tentativi; e per grandi SELECT/INSERT/UPDATE/DELETE segmentano i record in gruppi di 1000 fino a 10.000 in base alla lunghezza del record.

Dopo diversi anni, abbiamo migrato i dati su IaaS (SQL Server ospitato come vM su Azure Cloud).

La mia raccomandazione per voi, state attenti prima di scegliere SQL Azure, pensate a vantaggi e svantaggi!

Fortuna !!

Problemi correlati