2014-02-17 155 views
2

我一个非常大的,高流量的电子商务网站合作。我们目前正在将我们的网站从ColdFusion迁移到.NET。我们最近在转换期间遇到了一个问题,我希望得到一些帮助。我们目前的网站大约是1/3 .net和2/3的ColdFusion。.NET网站崩溃

一个问题虽然是,当我们发布了最新的项目,这是一个项目转换的我的账户,一切都很好了一段时间,但在任何地方3至24小时之间的网站刚刚崩溃。为了恢复它,我们需要重新启动IIS,有时还需要重新启动ColdFusion。当我说崩溃时,我的意思是它只是挂起,坐在那里并永远旋转。

我们有很好的服务器监控,但是当我们看服务内存没什么,除了连接到SQL的号码是不寻常的。出于某种原因,在SQL发生崩溃之前相当快速地发生了连接数量,它从大约24个连接到大约100个,只是坐在那里,并且该站点停止运行,直到我们重新启动服务。

我们目前使用SQL Server 2005中,实体框架作为我们的数据访问方法和我们的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中使用相同的散列方法。不知道这是否是问题,但认为值得一提。

任何想法?

+2

SQL连接数量在崩溃之前爆发的事实表明数据库问题。它可能是SQL Server中的死锁或超时? – recursive

+0

大概找出每个这些新的SQL连接正在做什么(正在运行哪些查询),这可能会揭示它们为何被创建的原因。 –

+0

我们在这些崩溃之前和期间运行SQL分析器,并没有看到任何超出规范的东西。 – user3320043

回答

0

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

当然是什么正在发生。你必须找出为什么这是发生。其中的可能性有:

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

您可能需要获取关于事物CF侧的更多信息,以确切知道这里发生了什么。


后续...即使您的问题来自.NET方面,我提供了一些CF方面的可能性。我假设CF可以发挥作用,因为重新启动CF有时可以解决问题。