2017-03-06 43 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。