“错误:19 - 物理连接不可用”与Azure数据库中的OWIN访问

时间:2014-04-07 09:30:26

标签: c# razor azure-sql-database owin connection-pooling

我已经在可怕的"错误19"上尝试了所有其他帖子。并发现少数答案不适用或没有帮助,因此这个新帖子。对于所有Azure + EF用户来说,这是一个非常严重的潜在问题。

第一次出现:

我正在使用VS2013 EF6.1 Razor项目中的所有内容的最新版本(最后列出的软件包)。数据库托管在SQL Azure上。

运行我的webapp几次后(在开发环境中)我收到此错误: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日提供第二笔赏金

我仍然遇到同样的问题,自上次发布以来进行了一些轻微的项目更改,因此很快会在下面发布最新的详细信息。

我已根据this postConnection Lifetime=3;Max Pool Size=3;添加到我的连接字符串中。

更新:2014年5月23日仍然出现错误

第二天,经过几十次调试后,这个错误又回来了。

更新:2014年6月11日

在2次赏金和无数谷歌调查之后(对此没有真正的答案),我不得不假设它是实体框架6中的一个缺陷,我以某种方式导致出现。

更多信息:

我在WinForm项目中遇到了同样的错误,连接到Azure。在这种情况下,我添加了每20个新项目后意外没有清除实体列表。

每次代码运行时,它都会添加20条记录并更新所有记录上的DateModified字段。当它达到1700个记录被更新时,突然发出了可怕的错误19 - 物理连接不可用&#34;。之后,我需要重新启动我的调试IIS才能使其工作。

显然,代码已经运行了大量更新,也许有关此问题的内容可以帮助某人想到某些内容

2 个答案:

答案 0 :(得分:4)

错误19是通信错误! (或者不仅仅是通信错误)

确保在LINQ to SQL查询中完成所有必需的.Include(x=>x.ForeignTable)调用!

2015年8月更新(可能的解决方案,至少,某些情况):

我们刚刚对这个问题进行了100%的复制,我们能够通过试错测试解决,所以它可能是一个解决方案,或者至少提供了寻找内容的线索。

情景:

  • 错误仅发生在IIS下运行的发布版本下。它不是在调试下或在IIS Express下发生的。
  • 我们还启用了SQL分析,以查看服务器实际命中的时间/位置。
  • 有问题的查询是获取匹配的记录,然后在结果的foreach次迭代中创建视图模型(即延迟评估)。视图模型依赖于查询实体的相关表中的值。

测试:

第一次尝试:删除查询中的所有复杂过滤器

  • 结果仍然失败,错误19

第二次尝试:在查询中添加ToList()以强制查询立即运行

  • 结果:成功!!! (显然这里发生了什么)

第三次尝试:删除ToList()并在查询中添加.Include(x=>x.ForeignTable)以强制包含相关数据。

  • 结果: 成功

我的新理论是:

如果您不小心遗漏了Include的外表,那么当懒惰评估时,EF会随机无法获取相关数据。这可能导致臭名昭着的错误19。

由于Identify Framework中存在外键关系,因此您可能会认为在OWIN内的某个查询中也缺少.Include()或等效项。使用OWIN或其他查询时,这可能会导致随机问题。

备注:

  • 要点的一个关键点是错误19 是一个通信错误。查询确实命中了SQL服务器。客户端无法获取相关数据是一个问题。

暂停掌声(我们很高兴找到这个):)

2015年8月28日更新:

今天再次遇到可怕的错误19,连接到本地SQL数据库(通常这对我来说是Azure的一个问题)。基于上面的结果,我只是在适当的地方添加了.Include(x=>x.ForeignTable)语句,问题就消失了!这似乎是EF的问题,并不总是能够延迟加载相关表信息。

答案 1 :(得分:1)

您是否尝试过SqlAzureExecutionStrategy?听起来连接被切断了,但是这个策略EF应该会自动重试重新连接。

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