2013-03-08 29 views
5

Tôi đã triển khai mã sau đây để xử lý logic thử lại INSERT/UPDATE với hàm trả về theo hàm mũ khi viết vào Cơ sở dữ liệu Azure.Cơ sở dữ liệu SQL Azure thử lại logic

static SqlConnection TryOpen(this SqlConnection connection) 
{ 
    int attempts = 0; 
    while (attempts < 5) 
    { 
    try 
    { 
     if (attempts > 0) 
     System.Threading.Thread.Sleep(((int)Math.Pow(3, attempts)) * 1000); 
     connection.Open(); 
     return connection; 
    } 
    catch { } 
    attempts++; 
    } 
    throw new Exception("Unable to obtain a connection to SQL Server or SQL Azure."); 
} 

Tuy nhiên, tôi cũng nên cân nhắc áp dụng lại logic cho cơ sở dữ liệu của mình? Hoặc phương thức SqlCommand.CommandTimeout() có đủ không? Hầu hết các nội dung đã được tôi thiết lập bằng cách sử dụng đoạn mã sau:

Dim myDateAdapter As New SqlDataAdapter(mySqlCommand) 
Dim ds As New DataSet 
myDateAdapter.Fill(ds, "dtName") 

Thật khó để biết những gì sắp xếp của lỗi thoáng qua sẽ xảy ra trong một môi trường sản xuất với Azure vì vậy tôi đang cố gắng làm càng nhiều giảm nhẹ càng tốt bây giờ.

Trả lời

5

Tôi nghĩ rằng thử lại sẽ là một phần của hoạt động cơ sở dữ liệu SQL Azure Windows của bạn nói chung.

Thay vì triển khai giải pháp tùy chỉnh, bạn đã xem transient fault handling application block được xuất bản bởi Mẫu và thực tiễn của Microsoft, cụ thể cho Cơ sở dữ liệu SQL chưa?

+0

Tôi đang xem xét điều này ngay bây giờ. Khối TFH có cung cấp thông tin chi tiết về lý do tại sao kết nối bị xóa không? – QFDev

4

Lỗi kết nối trong SQL Azure là phổ biến. Điều này là bởi vì ứng dụng của bạn sẽ tạo ra một hồ bơi kết nối nhưng trong khi bên của bạn nghĩ rằng các kết nối này là hơn, Azure có thể chấm dứt chúng ở cuối của họ và bạn sẽ không bao giờ biết về nó.

Chúng thực hiện việc này vì những lý do hợp lệ, chẳng hạn như một cá thể cụ thể đã bị quá tải và chúng đang chuyển các kết nối đến một số khác. Với các máy chủ SQL trong nhà, bạn thường không bao giờ gặp vấn đề này bởi vì các Máy chủ SQL của bạn luôn có sẵn và dành riêng cho việc sử dụng của bạn.

Ví dụ, tôi nhận được khoảng 5 lỗi kết nối với SQL Azure vào khoảng 100.000 truy vấn cơ sở dữ liệu trong một ngày.

Điều này sẽ xảy ra với SQL Azure. Nếu bạn đang sử dụng ADO.NET thì đề xuất của David về xử lý lỗi tạm thời là cách để đi.

Nếu bạn đang sử dụng Entity Framework, có tin tốt và tin xấu: Transient Fault Handling with SQL Azure using Entity Framework

1

tôi đã thực hiện SqlConnectionSqlCommand phương pháp khuyến nông cung cấp thử lại logic. Nó có sẵn trên NuGet.

Các vấn đề liên quan