web-dev-qa-db-ja.com

「エラー:19-物理接続が使用できません」AzureデータベースのOWINアクセス

私は恐ろしい「エラー19」に関する他のすべての投稿を試しましたが、答えのある少数の投稿が当てはまらないか、役に立たないことがわかりました。したがって、この新しい投稿です。これは、すべてのAzure + EFユーザーにとって非常に深刻な潜在的な問題です。

最初の発生:

VS2013 EF6.1 Razorプロジェクト(最後にリストされているパッケージ)のすべての最新バージョンを使用しています。データベースはSQLAzureでホストされています。

Webアプリを(開発環境で)数回実行した後、次のエラーが発生します:A transport-level error has occurred when receiving results from the server. (provider: Session Provider, error: 19 - Physical connection is not usable)

それが死ぬ線は常にこれです: enter image description here

接続プーリング(および接続不足)に関連するエラーを収集しましたが、どこにもリークを見つけることができません。

アプリ全体でOWINメンバーシップやその他のデータベース機能にアクセスすると、他のすべてのコントローラーが継承するDatabaseContollerがあります。これにより、関連するすべてのコンポーネントが作成され、それらが破棄されます。

DatabaseController.cs

[Authorize]
public class DatabaseController : Controller
{
    #region properties
    /// <summary>
    /// User manager - attached to application DB context
    /// </summary>
    protected UserManager<ApplicationUser> UserManager { get; set; }

    /// <summary>
    /// Role manager - attached to application DB context
    /// </summary>
    protected RoleManager<IdentityRole> RoleManager { get; set; }

    /// <summary>
    /// Application DB context
    /// </summary>
    protected ApplicationDbContext ApplicationDbContext { get; set; }

    /// <summary>
    /// Database context used by most controllers
    /// </summary>
    protected ApplicationEntities Context { get; set; }
    #endregion properties

    #region Constructors
    public DatabaseController()
    {
        this.Context = new ApplicationEntities ();
        this.ApplicationDbContext = new ApplicationDbContext();
        this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext));
        this.RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(this.ApplicationDbContext));
        this.UserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager) { AllowOnlyAlphanumericUserNames = false };
    }
    #endregion Constructors

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (UserManager != null)
            {
                this.UserManager.Dispose();
                this.UserManager = null;
            }
            if (this.RoleManager != null)
            {
                this.RoleManager.Dispose();
                this.RoleManager = null;
            }
            if (this.ApplicationDbContext != null)
            {
                this.ApplicationDbContext.Dispose();
                this.ApplicationDbContext = null;
            }
            if (this.Context != null)
            {
                this.Context.Dispose();
                this.Context = null;
            }
        }
        base.Dispose(disposing);
    }
}

インストールされているパッケージ

  <package id="Antlr" version="3.5.0.2" targetFramework="net45" />
  <package id="bootstrap" version="3.1.1" targetFramework="net45" />
  <package id="EntityFramework" version="6.1.0" targetFramework="net45" />
  <package id="jQuery" version="1.11.0" targetFramework="net45" />
  <package id="jQuery.Validation" version="1.11.1" targetFramework="net45" />
  <package id="json2" version="1.0.2" targetFramework="net45" />
  <package id="Microsoft.AspNet.Identity.Core" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Identity.EntityFramework" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Identity.Owin" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Mvc" version="5.1.1" targetFramework="net45" />
  <package id="Microsoft.AspNet.Razor" version="3.1.2" targetFramework="net45" />
  <package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi" version="5.1.2" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.1.2" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.1.2" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.1.2" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebPages" version="3.1.2" targetFramework="net45" />
  <package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.1.2" targetFramework="net45" />
  <package id="Microsoft.Owin" version="2.1.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Host.SystemWeb" version="2.1.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security" version="2.1.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Cookies" version="2.1.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Facebook" version="2.1.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Google" version="2.1.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.MicrosoftAccount" version="2.1.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.OAuth" version="2.1.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Twitter" version="2.1.0" targetFramework="net45" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
  <package id="Modernizr" version="2.7.2" targetFramework="net45" />
  <package id="Newtonsoft.Json" version="6.0.2" targetFramework="net45" />
  <package id="Owin" version="1.0" targetFramework="net45" />
  <package id="Owin.Security.Providers" version="1.3.1" targetFramework="net45" />
  <package id="Respond" version="1.4.2" targetFramework="net45" />
  <package id="WebGrease" version="1.6.0" targetFramework="net45" />

接続リークであるとすると、リークの原因を突き止めるにはどうすればよいですか?

さらに情報が必要な場合は、お問い合わせください。

更新:2014年5月22日セカンドバウンティが提供されました

私はまだ同じ問題を抱えていますが、前回の投稿以降にプロジェクトに若干の変更が加えられているため、最新の詳細をまもなく投稿します。

私が追加しました Connection Lifetime=3;Max Pool Size=3;この投稿 に基づいて、接続文字列に。

更新:2014年5月23日エラーが引き続き発生する

翌日、数十回デバッグした後、このエラーが返されました。

更新:2014年6月11日

2つの報奨金と数え切れないほどのGoogleの調査(これに対する本当の答えはありません)の後、私はそれがEntity Framework 6の欠陥であると想定する必要があります。

詳細情報:

WinFormプロジェクトで同じエラーが発生しました。Azureに接続してください。この例では、20個の新しいアイテムが追加されるたびに、誤ってエンティティリストをクリアしていませんでした。

コードが実行されるたびに、さらに20個のレコードが追加され、それらすべてのDateModifiedフィールドが更新されました。更新中の1700レコードに達するまでに、突然、恐ろしい「エラー19-物理接続が使用できません」というメッセージが表示されました。その後、デバッグを再開する必要がありましたIISそれがまったく機能するためには、.

明らかに、コードは大量の更新を実行しており、おそらくこれに関する何かが誰か何かを考えるのに役立つでしょう。

29
Gone Coding

エラー19はnot通信エラーです! (または単なる通信エラーではありません)

LINQ toSQLクエリで必要なすべての.Include(x=>x.ForeignTable)呼び出しがあることを確認してください!

2015年8月に更新(少なくとも、いくつかのシナリオの可能な解決策):

この問題について100%再現されたばかりで、試行錯誤のテストで解決できたので、解決策になるか、少なくとも何を探すべきかについての手がかりを提供する可能性があります。

シナリオ:

  • このエラーは、IISで実行されているリリースビルドでのみ発生しました。デバッグ中またはIIS Express)では発生しませんでした。
  • また、SQLプロファイリングをオンにして、サーバーが実際に攻撃された日時と場所を確認しました。
  • 問題のクエリは、一致するレコードをフェッチし、結果のforeach反復でビューモデルを作成することでした(つまり、遅延評価)。ビューモデルは、クエリされたエンティティのrelatedテーブルの値に依存していました。

テスト:

最初の試行:クエリの複雑なフィルターを削除します

  • 結果:エラー19で失敗しました

2回目の試行:クエリにToList()を追加して、クエリを強制的に実行してすぐに完了させます。

  • 結果:成功!!! (明らかにここで何かが起こっています)

回目の試行:ToList()を削除し、クエリに.Include(x=>x.ForeignTable)を追加して、関連データを強制的に含めます。

  • 結果:成功

私の新しい理論は次のとおりです。

誤って外部テーブルのIncludeを省略した場合、EFは遅延評価時に関連データのフェッチにランダムに失敗します。これにより、悪名高いエラー19が発生する可能性があります。

Identification Frameworkには外部キーの関係があるため、OWIN内のどこかのクエリに.Include()または同等のものが欠落していると思われるかもしれません。これは、OWINまたは他のクエリを使用するときにランダムな問題を引き起こしている可能性があります。

注:

  • 取り除くべき重要なポイントは、エラー19がnot通信エラーであるということです。クエリはSQLサーバーにヒットします。これは、関連データのフェッチに失敗するというクライアント側の問題です。

拍手のために一時停止します(これを見つけてとてもうれしいです):)

2015年8月28日更新:

今日も恐ろしいエラー19が発生し、ローカルSQLデータベースに接続しました(通常、これは私にとってAzureの問題でした)。上記の結果に基づいて、必要に応じて.Include(x=>x.ForeignTable)ステートメントを追加するだけで、問題は解消されました。これは、EFが関連テーブル情報を常に遅延ロードできるとは限らないという問題のようです。

4
Gone Coding

SqlAzureExecutionStrategyを試しましたか?接続が切断されているように聞こえますが、この戦略では、EFは自動的に再接続を再試行する必要があります。

http://msdn.Microsoft.com/en-us/data/dn456835.aspx

1
Robert Muehsig