2013-01-05 4 views
5

Konsequent erhalte ich einen Fehler vom Sitzungsstatusmodul in der ASP.NET 4.5-Windows Azure-Webrolle, die auf eine SQL Azure-Datenbank verweist. Das Sitzungsstatusmodul verwendet den dbcontext. Die Ausnahme inkl. stacktrace ist:Konsequenterweise "Timeout-Zeitraum" vom Sitzungszustandsanbieter (Entity Framework) mit SQL Azure empfangen

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) 

Können Sie mir bei diesem Problem bitte helfen?

+0

Haben Sie jemals eine Antwort darauf gefunden? Ich wette, dass ich diese auch bekommen werde, aber nur gelegentlich. – dreza

+0

Vielleicht ein Wiederholungsverzögerungsalgorithmus wie: http://stackoverflow.com/questions/17215377/connection-timeout-in-sql-azure –

Antwort

0

SQL Azure bietet begrenzte Ressourcen, da jede Datenbank auf gemeinsam genutzten Servern ausgeführt wird. Wenn ein anderer Client lange Abfragen auf demselben Server ausführt, an dem Sie arbeiten, nimmt die Anwendungsleistung ab.

Nach meiner Erfahrung in zwei Jahren mit SQL Azure müssen Sie einige Wiederholungslogik in Ihrem DAL implementieren, damit Ihre Anwendung Abstürze mit dieser Art von Fehlern vermeiden. Außerdem ist jede Datenbank auf bis zu 180 gleichzeitige Verbindungen und weitere Einschränkungen (wie Größe, Verwaltung usw.) beschränkt. Jede Verbindung nach 180 wird zurückgewiesen. Sie müssen Ihre Anwendung sorgfältig vor DoS-Angriffen schützen!

Es gibt keine Option (oder Konfiguration) für Standardbenutzer (wie Sie oder ich) von SQL Azure, um diese Einschränkungen (auch in Enterprise-Datenbanken) zu minimieren. In meiner Firma als DBA-Team hatten wir mehrere Tickets mit dem Microsoft Ops-Team über viele Probleme im Zusammenhang mit hohen Transaktionslasten geöffnet, und die Empfehlungen von ihnen sprachen über die Partitionierung von Daten entlang mehrerer Datenbanken, Indizierung, Wiederholungsrichtlinie und verzögerte Wiederholungsrichtlinie (für Verbindungen/Logins und Abfragen) - eingestellt auf 5 Wiederholungen; Bei großen SELECTs/INSERTs/UPDATEs/DELETEs segmentieren Sie die Datensätze in Gruppen von 1000 bis zu 10.000, je nach Länge des Datensatzes.

Nach mehreren Jahren haben wir unsere Daten auf IaaS (SQL Server als vM auf der Azure Cloud gehostet) migriert.

Meine Empfehlung für Sie, seien Sie vorsichtig, bevor Sie SQL Azure wählen, überlegen Sie sich Vor- und Nachteile!

Glück !!

Verwandte Themen