.NET网站崩溃

时间:2014-02-17 17:19:12

标签: c# asp.net iis coldfusion

我在一个非常大的高流量电子商务网站上工作。我们目前正在将我们的网站从ColdFusion迁移到.NET。我们最近在转换过程中遇到了一个问题,我希望能提供一些帮助。我们目前的网站约为1/3 .net和2/3 ColdFusion。

但有一个问题是,当我们发布我们的最新项目时,这是一个转换我的帐户部分的项目,一切都很好,但是在3到24小时之间,网站就会崩溃。为了重新启动它,我们需要重新启动IIS,有时需要重新启动ColdFusion。当我说崩溃时,我的意思是它只是悬挂,坐在那里并永远旋转。

我们有非常好的服务器监控,但是当我们查看服务内存时,除了与SQL的连接数之外,没有什么是不寻常的。出于某种原因,在崩溃之前SQL很快就会出现连接数量,它从大约24个连接到大约100个,只是坐在那里,网站停止运行直到我们重新启动服务。

我们目前使用SQL Server 2005,Entity框架作为我们的数据访问方法,我们在IIS 7.5上使用。我们的Web服务器是虚拟的,但我们的数据库是物理的。

我们团队中有多个人通过这个新项目中的所有代码来确认他们没有被打开的连接,因为基于连接问题的类型看起来怎么样。我们无法找到任何连接,而不是一个。

这是我们当前对实体的数据访问的一个示例:

    /// <summary>
    /// Get Products by their Primary Category ID.  Default Category ID is 0: Top Level Categories.
    /// </summary>
    /// <param name="languageCode">Two character language code of Categories being searched.  Defined in dbo.Languages, LanguageCode field.</param>
    /// <param name="primaryCategoryId">int - Primary Category ID</param>
    /// <returns>List&lt;Product%gt;</returns>
    public List<Products.Product> GetProducts(string languageCode, int primaryCategoryId = 0)
    {
        CatalogEntity context = null;
        EntityConnection conn = null;

        try
        {
            conn = this.GetConnection();
            context = new CatalogEntity(conn);

            List<I_Products> Products = context.GetProductsByPrimaryCatId(primaryCategoryId, languageCode).Distinct().ToList();
            return Products.Select(Product => new Products.Product(Product)).Distinct().ToList();
        }
        catch (System.Exception ex)
        {
            string message = "Error occurred while calling GetProducts.";
            throw new Exception.CatalogDataException(message, CodeLibrary.Core.Helpers.ProcessHelper.GetProcessName(this), ex);
        }
        finally
        {
            if (conn != null && conn.State == ConnectionState.Open) conn.Close();
            if (context != null) context.Dispose();
            conn.Dispose();
        }
    }

同样,这只是C#中我们的一种数据访问方法的一个例子。不要看到这个问题吗?同样,我们全面使用这种格式。我们已经证实了这一点。

使用新的.net项目,我们使用.net成员资格提供程序。我们使用CLR用哈希加密用户密码,以便我们可以在CF中使用相同的哈希方法。不确定这是否是问题,但认为值得一提。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这里列出了一些可能性。例如,当对SQL服务器的调用无法将数据返回到CF时,CF可以挂起到该线程。它变成了一种“虚幻的线索”。然后,CF会创建与数据库服务器的新连接,并将它们添加到连接池中 - 从而导致您看到许多额外的连接。它计入CF管理员中的“同时请求”设置。当有足够的“挂起”您的请求队列并且您的服务器锁定时,即使它没有出现任何事情。您可以通过使用服务器监视器(如果在企业版上)或使用fusionreactor(用于CF / Java服务器的优秀且廉价的第三方内省监视器)启用指标来查看此行为。

当然那是正在发生什么。你必须找出为什么它正在发生。其中的可能性包括:

  • 网络 - 有时,交换机端口上的自动同步可能会中断连接并导致挂起“幻像”线程。请参阅Hanging jrun and networking上的这篇文章。
  • 数据库锁定 - 这可能会产生这样的问题,即使您认为自己没有看到它也可能会发生。抓住它有时很棘手。可能很麻烦的一个特殊锁定问题是“max degree of parallelism”,这可能导致相当空闲的DB连接仍然悬挂。

您可能需要在CF方面获得更多信息,以确切知道这里发生了什么。


跟进......即使您的问题来自.NET方面,我也会从CF方面提供一些可能性。我假设CF可以在播放,因为重启CF有时会解决问题。