17

現在、アプリケーションで SQL Azure と Entity SQL を使用しています。

例えば

Entities model = new Entities();
db_Item item = model.db_Item.First();

Enterprise Library から Transient Fault Handling を使用したいのですが、Entities クラスをオーバーライドするようなことを可能にする例や解決策が見つからないため、コードを何百回も更新する必要はありません。場所の。

誰かがこれを行う方法についてさらに情報を提供してもらえますか?

4

5 に答える 5

19

私がこれまでに持っているものを通過します。

  1. Entity Framework は、接続が開いていて、SQL がサーバーに送信されるセクションへのアクセスを提供しないため、現在、この領域に再試行ロジックを提供することはできません。

  2. EF チームはこの不足を認識しており、おそらくバージョン 6 の EF に再試行ロジックを実際に統合することを計画しています。

  3. [1] のケース #3 に従って、OnContextCreated で SQL コマンドをデータベースに送信できます。ただし、これは、DB に対して行うすべての単一の DB 呼び出しに対して、2 を行う必要があることを意味します。パフォーマンスを気にしない限り、ほとんどの状況ではこれをお勧めしません。

  4. これまでのところ実行可能な唯一のオプションは、データベースに対して行うすべての呼び出しに対して、エンタープライズ ライブラリの一時的な障害処理アプリケーション ブロック [2] の形式で再試行ロジックを実装することです。既存のアプリケーションでは、これは非常に面倒です。

  5. 時間ができたら、EF 6 を待つ間、EF のソース コードをさらに調べて、さらに何かできるかどうかを確認します。 [3] を監視します。

  6. 現在、EF チームによって審査中です。[4]

更新: 2013-11-14

この投稿を更新して、EF6 がリリースされ、すぐに使用できる接続の復元力をサポートしていることを皆さんにお知らせしたいと思いました。https://www.nuget.org/packages/EntityFramework/

回避策はもう必要ありません。

更新: 2013-03-23

接続の回復力を備えた EF 6 Alpha 3 がリリースされました - http://entityframework.codeplex.com/wikipage?title=Connection%20Resiliency%20Spec

更新: 2012-11-04

EF チームは、EF 6 の計画を公式に発表しました。 [4]

[1] http://blogs.msdn.com/b/appfabriccat/archive/2010/12/11/sql-azure-and-entity-framework-connection-fault-handling.aspx

[2] http://msdn.microsoft.com/en-us/library/hh680934(v=pandp.50).aspx

[3] http://entityframework.codeplex.com/wikipage?title=ロードマップ

[4] http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/2426525-automatically-perform-retry-logic-for-sql-azure

于 2012-10-05T02:58:25.377 に答える
11

ありがたいことに、新しい Transient Fault Handling Application ブロックを使用すると、非常に簡単になります。必要なものはすべてここにあります:

http://geekswithblogs.net/ScottKlein/archive/2012/01/27/understanding-sql-azure-throttling-and-implementing-retry-logic.aspx

そしてビデオ形式で:

http://channel9.msdn.com/Shows/Cloud+Cover/Episode-68-Throttling-in-SQL-Azure-with-Scott-Klein

上記のリンクの例:

using (NorthwindEntities dc = new NorthwindEntities())
{
    RetryPolicy myPolicy = new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>(3);
    Employee e1 = myPolicy.ExecuteAction<Employee>(() =>
        (from x in dc.Employees
            where x.LastName == "King"
            select x).First());
}

ご覧のとおり、RetryPolicy を作成し、アクションにラップされたクエリでその ExecuteAction 関数を呼び出すだけです。

* *編集

コンテキストのオーバーライドの例:

private RetryPolicy m_RetryPolicy = new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>(....

public override int SaveChanges()
{
    return m_RetryPolicy.ExecuteAction<int>(() =>
    {
        return base.SaveChanges();
    });
}

// Pass anonymous query func in here
public T AutoRetryQuery<T>(Func<T> query)
{
    return m_RetryPolicy.ExecuteAction<T>(query);
}
于 2012-10-27T00:41:25.063 に答える
1

私も同じ問題を抱えていました。私の場合、LINQ-To-SQLを使用しています(エンティティフレームワークにも同じことが当てはまると思います)。これが私が計画していることです。

リポジトリ パターンを使用して Linq-to-sql クエリを抽象化し、再試行メカニズムでデータベース リクエストを生成する Linq-to-sql コードをラップします。

そのために、と呼ばれるメソッドを作成し、ExecuteWithRetry(Action action)このメソッドを次のように呼び出すことをお勧めしますExecuteWithRetry(()=> { db_Item item = model.db_Item.First(); });

メソッドはこのように実装できます

private void  ExecuteWithRetry(Action action)
{
  var retryStrategy = new Incremental(5, TimeSpan.FromSeconds(1), 
  TimeSpan.FromSeconds(2));

  // Define your retry policy using the retry strategy and the Windows Azure storage
  // transient fault detection strategy.
  var retryPolicy =
  new RetryPolicy<StorageTransientErrorDetectionStrategy>(retryStrategy);

  // Receive notifications about retries.
  retryPolicy.Retrying += (sender, args) =>
  {
    // Log details of the retry.
    var msg = String.Format("Retry - Count:{0}, Delay:{1}, Exception:{2}",
        args.CurrentRetryCount, args.Delay, args.LastException);
    Trace.WriteLine(msg, "Information");
  };

  try
  {
    this.retryPolicy.ExecuteAction(action);
  }
  catch (Exception ex)
  {
     Trace.TraceError(ex.TraceInformation());
    throw;
  }
 }

私もこのアプローチを試してみます。うまくいくことを願っています

于 2012-10-04T08:17:10.367 に答える
0

実際には、MS が提供する拡張メソッドを使用したいと考えています。参照: http://msdn.microsoft.com/en-us/library/hh680906(v=pandp.50).aspx

「さらに、SqlCommandExtensionsおよびSqlConnectionExtensionsクラスは、.NET 開発者が SQL Azure データベース接続を開き、SQL コマンドを呼び出すことができる一連の拡張メソッドを提供します。これらの拡張メソッドは、コードを適用できない場合に役立ちます。 ReliableSqlConnection クラスの利点. たとえば、SqlConnection インスタンスを内部的に使用するエンタープライズ ライブラリ データ アクセス アプリケーション ブロックまたはエンティティ フレームワークを使用している場合があります.この場合、拡張メソッドは、一時的なエラー処理アプリケーション ブロックによって提供される再試行機能を追加するのに役立ちます.大きなやり直しなしで既存のコードに。

"

于 2012-09-05T21:38:33.487 に答える