私は恐ろしい「エラー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)
それが死ぬ線は常にこれです:
接続プーリング(および接続不足)に関連するエラーを収集しましたが、どこにもリークを見つけることができません。
アプリ全体でOWINメンバーシップやその他のデータベース機能にアクセスすると、他のすべてのコントローラーが継承するDatabaseContoller
があります。これにより、関連するすべてのコンポーネントが作成され、それらが破棄されます。
[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" />
接続リークであるとすると、リークの原因を突き止めるにはどうすればよいですか?
さらに情報が必要な場合は、お問い合わせください。
私はまだ同じ問題を抱えていますが、前回の投稿以降にプロジェクトに若干の変更が加えられているため、最新の詳細をまもなく投稿します。
私が追加しました Connection Lifetime=3;Max Pool Size=3;
この投稿 に基づいて、接続文字列に。
翌日、数十回デバッグした後、このエラーが返されました。
2つの報奨金と数え切れないほどのGoogleの調査(これに対する本当の答えはありません)の後、私はそれがEntity Framework 6の欠陥であると想定する必要があります。
詳細情報:
WinFormプロジェクトで同じエラーが発生しました。Azureに接続してください。この例では、20個の新しいアイテムが追加されるたびに、誤ってエンティティリストをクリアしていませんでした。
コードが実行されるたびに、さらに20個のレコードが追加され、それらすべてのDateModified
フィールドが更新されました。更新中の1700レコードに達するまでに、突然、恐ろしい「エラー19-物理接続が使用できません」というメッセージが表示されました。その後、デバッグを再開する必要がありましたIISそれがまったく機能するためには、.
明らかに、コードは大量の更新を実行しており、おそらくこれに関する何かが誰かが何かを考えるのに役立つでしょう。
.Include(x=>x.ForeignTable)
呼び出しがあることを確認してください!この問題について100%再現されたばかりで、試行錯誤のテストで解決できたので、解決策になるか、少なくとも何を探すべきかについての手がかりを提供する可能性があります。
foreach
反復でビューモデルを作成することでした(つまり、遅延評価)。ビューモデルは、クエリされたエンティティのrelatedテーブルの値に依存していました。最初の試行:クエリの複雑なフィルターを削除します
2回目の試行:クエリにToList()
を追加して、クエリを強制的に実行してすぐに完了させます。
回目の試行:ToList()
を削除し、クエリに.Include(x=>x.ForeignTable)
を追加して、関連データを強制的に含めます。
誤って外部テーブルのInclude
を省略した場合、EFは遅延評価時に関連データのフェッチにランダムに失敗します。これにより、悪名高いエラー19が発生する可能性があります。
Identification Frameworkには外部キーの関係があるため、OWIN内のどこかのクエリに.Include()
または同等のものが欠落していると思われるかもしれません。これは、OWINまたは他のクエリを使用するときにランダムな問題を引き起こしている可能性があります。
拍手のために一時停止します(これを見つけてとてもうれしいです):)
今日も恐ろしいエラー19が発生し、ローカルSQLデータベースに接続しました(通常、これは私にとってAzureの問題でした)。上記の結果に基づいて、必要に応じて.Include(x=>x.ForeignTable)
ステートメントを追加するだけで、問題は解消されました。これは、EFが関連テーブル情報を常に遅延ロードできるとは限らないという問題のようです。
SqlAzureExecutionStrategyを試しましたか?接続が切断されているように聞こえますが、この戦略では、EFは自動的に再接続を再試行する必要があります。