2014-02-17 79 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有時可以解決問題。