2013-03-12 21 views
6

Tôi là một anh chàng vb.net và gặp khó khăn khi đọc C#. Tôi biên soạn C# Dapper thành một DLL và sử dụng nó ứng dụng của tôi. Mối quan tâm chính của tôi là tôi nghĩ rằng tôi cần phải sửa đổi nguồn để tích hợp theo mặc định khung xử lý lỗi thoáng qua cho SQL Azure trong mỗi truy vấn SQL.Cách triển khai Khung xử lý lỗi tạm thời SQL Azure cho Dapper?

Tôi có thể thêm logic thử lại ở cấp kết nối vì nó là đầu trên của công cụ vẽ, nhưng không phải ở cấp truy vấn thực thi được nhúng trong lớp trình rút gọn.

Mọi người đã làm điều đó chưa?

* CẬP NHẬT *

Không sử dụng chỉ ReliableSqlConnection trên đầu trang của cuộc gọi Dapper sẽ xử lý logic retry trên thực hiện không truy vấn?

Đây là mẫu mã của retry từ MS với lỗi transietn hanling

using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling; 
using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.AzureStorage; 
using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.SqlAzure; 
using System.Data; 

... 

using (ReliableSqlConnection conn = new ReliableSqlConnection(connString, retryPolicy)) 
{ 
conn.Open(); 

IDbCommand selectCommand = conn.CreateCommand(); 
selectCommand.CommandText = 
    "UPDATE Application SET [DateUpdated] = getdate()"; 

// Execute the above query using a retry-aware ExecuteCommand method which 
// will automatically retry if the query has failed (or connection was 
// dropped). 
int recordsAffected = conn.ExecuteCommand(selectCommand, retryPolicy); 

} 

Dưới đây là thực hiện một phần của mã Dapper, cùng tên được sử dụng nhưng tôi đoán nó là một tùy chỉnh thực hiện chức năng

private static int ExecuteCommand(IDbConnection cnn, IDbTransaction transaction, string sql, Action<IDbCommand, object> paramReader, object obj, int? commandTimeout, CommandType? commandType) 
    { 
     IDbCommand cmd = null; 
     bool wasClosed = cnn.State == ConnectionState.Closed; 
     try 
     { 
      cmd = SetupCommand(cnn, transaction, sql, paramReader, obj, commandTimeout, commandType); 
      if (wasClosed) cnn.Open(); 
      return cmd.ExecuteNonQuery(); 
     } 
     finally 
     { 
      if (wasClosed) cnn.Close(); 
      if (cmd != null) cmd.Dispose(); 
     } 
    } 
+0

tôi có thể khẳng định rằng tôi chắc chắn có không - mặc dù cá nhân tôi sẽ được mong đợi để thực hiện xử lý lỗi tạm thời * xung quanh * dapper hơn là bên trong dapper. –

+0

Có nhưng xung quanh người lập bản đồ sẽ có hiệu quả đối với kết nối, nhưng logic tích hợp cũng ExecuteReaderWithRetry, hoặc NonQuery, vv Toàn bộ với thử lại ở cấp thực thi phải được tích hợp với dapper nếu tôi hiểu rõ. –

+1

Vâng, nhưng bạn chỉ có thể viết một phương pháp mở rộng "làm với thử lại" ... –

Trả lời

2

Tôi khuyên bạn nên gói thử lại xung quanh Dapper, tốt nhất là bằng cách sử dụng phương thức RetryPolicy.ExecuteAction. Bằng cách đó cả hai cuộc gọi MỞ để kết nối và lệnh tự nó sẽ được thử lại bằng cách sử dụng chính sách TFH retry:

Ví dụ:

 SqlRetryPolicy.ExecuteAction(() => 
     { 
      // Place Dapper ExecuteCommand here: e.g. 
      ExecuteCommand(conn, trans, ...) 
     }); 
Các vấn đề liên quan