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.
Điều này chắc chắn không giống như tuyên bố chung. Những gì profiler dấu vết? Tại sao giả sử kết nối được mở bởi nhà phát triển và được xử lý cho EF? Tôi không thấy bất cứ điều gì như thế này trong câu hỏi ban đầu (và nó không phải là thực tế phổ biến với EF).
Vì vậy, các câu hỏi vẫn chưa được trả lời: Tại sao điều này không được xử lý bởi SqlAzureExecutionStrategy? Nó là một ý tưởng tốt để viết một DbExecutionStrategy riêng mà xử lý này?
Vì tôi có thể thấy lỗi này trong dịch vụ Azure của mình theo thời gian, tôi đã quyết định thử nghiệm nó. Đây là chiến lược của tôi:
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, vì vậy sau một thời gian khai thác gỗ và tôi có thể nói rằng chiến lược dựa trên
if (err.Number == 19)
là sai. Đối tượng SqlException thực tế cho lỗi này có ErrorCode = -2146232060
và Number = -1
- Tôi không thể tìm thấy bất kỳ tài liệu nào cho chúng, vì vậy tôi quyết định không dựa trên chiến lược đó. Để bây giờ tôi đang cố gắng kiểm tra tầm thường:
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:
Nó hoạt động. Không còn Physical connection is not usable
lỗi nào nữa và không có RetryLimitExceededException, vì vậy lỗi này thực tế thoáng qua (có thể giải quyết bằng cách thử lại), vì vậy tôi nghĩ rằng nó nên được bao gồm trong SqlAzureExecutionStrategy
.
Tôi thực sự hy vọng ai đó sẽ trả lời câu hỏi này. Nó là không thể tin được với tôi rằng điều này là "mong đợi và bình thường" trong Azure, nhưng SqlAzureExecutionStrategy không xử lý lỗi cụ thể này. –
Báo cáo lỗi. Dự án là nguồn mở. Cam kết đang đến qua mỗi ngày. – usr
Đây có phải là lỗi ở nơi đầu tiên không? Đó là điều xảy ra thường xuyên đến nỗi tôi có cảm giác đó là một quyết định thiết kế. –