From the profiler trace we observe that the same connection is used for each query database query. This is by design and as discussed early, i.e. when a connection is explicitly opened by the developer it tells EF not to open/reopen a connection for each command.
Beh, questo certamente non sembra una dichiarazione generale. Quale traccia di profiler? Perché supponiamo che la connessione sia stata esplicitamente aperta dallo sviluppatore e gestita dall'EF? Non vedo nulla di simile nella domanda originale (e non è una pratica comune con EF).
Quindi le domande rimangono senza risposta: perché questo non è gestito da SqlAzureExecutionStrategy? È una buona idea scrivere una propria DbExecutionStrategy che gestisca questa?
Poiché è possibile visualizzare questo errore nel servizio di Azure di tanto in tanto, ho deciso di testarlo. Qui è la mia strategia:
public class ExtendedSqlAzureExecutionStrategy : SqlAzureExecutionStrategy
{
public ExtendedSqlAzureExecutionStrategy(int maxRetryCount, TimeSpan maxDelay) : base(maxRetryCount, maxDelay)
{ }
protected override bool ShouldRetryOn(Exception exception)
{
return base.ShouldRetryOn(exception) || IsPhysicalConnectionNotUsableSqlException(exception);
}
private bool IsPhysicalConnectionNotUsableSqlException(Exception ex)
{
var sqlException = ex as SqlException;
if (sqlException != null)
{
// Enumerate through all errors found in the exception.
foreach (SqlError err in sqlException.Errors)
{
if (err.Number == 19)
{
return true;
}
}
}
return false;
}
}
EDIT
Ok, quindi dopo un po 'di tempo e la registrazione posso dire che basa la strategia su
if (err.Number == 19)
è sbagliato. L'oggetto SqlException effettivo per questo errore ha ErrorCode = -2146232060
e Number = -1
- Non ho trovato alcuna documentazione per questi, quindi ho deciso di non basare la strategia su di essi. Per ora sto cercando di controllo banale:
public class ExtendedSqlAzureExecutionStrategy : SqlAzureExecutionStrategy
{
public ExtendedSqlAzureExecutionStrategy(int maxRetryCount, TimeSpan maxDelay) : base(maxRetryCount, maxDelay)
{ }
protected override bool ShouldRetryOn(Exception exception)
{
return base.ShouldRetryOn(exception) || IsPhysicalConnectionNotUsableSqlException(exception);
}
private bool IsPhysicalConnectionNotUsableSqlException(Exception ex)
{
var sqlException = ex as SqlException;
if (sqlException != null)
{
return sqlException.Message.Contains("Physical connection is not usable");
}
return false;
}
}
EDIT 2:
Funziona. Non più errori Physical connection is not usable
e nessun RetryLimitExceededException, quindi questo errore è di fatto transitorio (risolvibile da tentativi), quindi penso che dovrebbe essere incluso in SqlAzureExecutionStrategy
.
Spero davvero che qualcuno risponda a questo. È incredibile per me che questo sia "previsto e normale" in Azure, ma SqlAzureExecutionStrategy non gestisce questo particolare errore. –
Segnala il bug. Il progetto è open source. I commit stanno arrivando ogni giorno. – usr
Si tratta di un bug in primo luogo? È qualcosa che accade così spesso che ho la sensazione che sia stata una decisione di progettazione. –