2017-03-06 44 views
0

我得到一個包含4000個條目的文件並對其進行修改,所以如果一個條目有損壞數據,我不會丟失整個消息。Biztalk Debatched消息值緩存

的Biztalkmap正在訪問的SQL服務器,之前我debatched我只需在地圖緩存SLQ數據的消息,但現在我有4000張indipendent地圖。

沒有緩存的過程需要大約30倍的時間。

有沒有一種方法可以將SQL Server中的數據從Map中緩存到某處,而不會損失很多性能?

回答

0

我總是會避免在地圖中訪問SQL Server - 它會非常容易地無意中發出比您打算的更多的呼叫(無論是因爲地圖設計中的錯誤還是由於地圖上的意外音量或使用情況特定端口或一組端口)。事實上,我通常會避免在必須訪問另一個系統或服務的地圖上進行任何類型的調用,但如果必須,則緩存可以提供幫助。

您可以使用例如MemoryCache進行緩存。我使用的模式通常包括一個定製的C#庫,您首先檢查緩存爲您的價值,如果有一個小姐,你檢查SQL(無論是對paritcular條目或整個緩存,例如:

object _syncRoot = new object(); 

... 
public string CheckCache(string key) 
{ 
    string check = MemoryCache.Default.Get(key) as string; 

    if (check == null) 
    { 
     lock (_syncRoot) 
     { 
      // make sure someone else didn't get here before we acquired the lock, avoid duplicate work 
      check = MemoryCache.Default.Get(key) as string; 
      if (check != null) return check; 

      string sql = @"SELECT ..."; 

      using (SqlConnection conn = new SqlConnection(connStr)) 
      { 
       conn.Open(); 

       using (SqlCommand cmd = conn.CreateCommand()) 
       { 
        cmd.CommandText = sql; 
        cmd.Parameters.AddWithValue(...); 

        // ExecuteScalar or ExecuteReader as appropriate, read values out, store in cache 
        // use MemoryCache.Default.Add with sensible expiration to cache your data 
       } 
      } 
     } 
    } 
    else 
    { 
     return check;   
    } 
} 

有幾件事情要記住:

  1. 這將在一個工作每AppDomain基礎,管道和業務流程在不同的應用程序域運行。如果你是在這兩個地方執行此地圖時,會用緩存告終。在這兩個地方,試圖分享這個跨AppDomains的複雜性可能不值得,但如果你真的需要你應該隔離你的緩存變成像WCF NetTcp服務。
  2. 這將使用更多的內存 - 您不應該將所有內容和任何東西放入BizTalk中的緩存中,並且如果要緩存內容,請確保機器上有大量可用內存,並且將BizTalk配置爲能夠使用它。
  3. MemoryCache可以存儲你想要的任何東西 - 我在這裏使用字符串,但它也可以是其他原始類型或對象。
2

這不是一個值得推薦的模式在地圖來訪問數據庫。

既然你描述的聲音是什麼樣你檢索靜態參考的數據,另一種選擇是將過程移動到參考數據一次檢索到的消息的業務流程。

然後,您可以使用提供參考數據和業務消息的雙輸入Map。

在這個模式中,您可以在Orchestration中調度或使用Sequential Convoy。